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.TrainingClassPageEdit; 020import com.echothree.control.user.training.common.edit.TrainingEditFactory; 021import com.echothree.control.user.training.common.form.EditTrainingClassPageForm; 022import com.echothree.control.user.training.common.result.EditTrainingClassPageResult; 023import com.echothree.control.user.training.common.result.TrainingResultFactory; 024import com.echothree.control.user.training.common.spec.TrainingClassPageSpec; 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.TrainingClassPage; 034import com.echothree.model.data.training.server.entity.TrainingClassPageDetail; 035import com.echothree.model.data.training.server.entity.TrainingClassPageTranslation; 036import com.echothree.model.data.training.server.entity.TrainingClassSection; 037import com.echothree.model.data.training.server.value.TrainingClassPageDetailValue; 038import com.echothree.model.data.training.server.value.TrainingClassPageTranslationValue; 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 EditTrainingClassPageCommand 054 extends BaseAbstractEditCommand<TrainingClassPageSpec, TrainingClassPageEdit, EditTrainingClassPageResult, TrainingClassPage, TrainingClassPage> { 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.TrainingClassPage.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("TrainingClassPageName", FieldType.ENTITY_NAME, true, null, null) 072 )); 073 074 EDIT_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList( 075 new FieldDefinition("TrainingClassPageName", FieldType.ENTITY_NAME, true, null, null), 076 new FieldDefinition("PercentageToPass", FieldType.FRACTIONAL_PERCENT, false, null, null), 077 new FieldDefinition("QuestionCount", FieldType.UNSIGNED_INTEGER, false, null, null), 078 new FieldDefinition("SortOrder", FieldType.SIGNED_INTEGER, true, null, null), 079 new FieldDefinition("Description", FieldType.STRING, false, 1L, 132L), 080 new FieldDefinition("PageMimeTypeName", FieldType.MIME_TYPE, false, null, null), 081 new FieldDefinition("Page", FieldType.STRING, false, null, null) 082 )); 083 } 084 085 /** Creates a new instance of EditTrainingClassPageCommand */ 086 public EditTrainingClassPageCommand(UserVisitPK userVisitPK, EditTrainingClassPageForm form) { 087 super(userVisitPK, form, COMMAND_SECURITY_DEFINITION, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS); 088 } 089 090 @Override 091 public EditTrainingClassPageResult getResult() { 092 return TrainingResultFactory.getEditTrainingClassPageResult(); 093 } 094 095 @Override 096 public TrainingClassPageEdit getEdit() { 097 return TrainingEditFactory.getTrainingClassPageEdit(); 098 } 099 100 TrainingClassSection trainingClassSection; 101 102 @Override 103 public TrainingClassPage getEntity(EditTrainingClassPageResult result) { 104 var trainingControl = Session.getModelController(TrainingControl.class); 105 TrainingClassPage trainingClassPage = null; 106 String trainingClassName = spec.getTrainingClassName(); 107 TrainingClass trainingClass = trainingControl.getTrainingClassByName(trainingClassName); 108 109 if(trainingClass != null) { 110 String trainingClassSectionName = spec.getTrainingClassSectionName(); 111 112 trainingClassSection = trainingControl.getTrainingClassSectionByName(trainingClass, trainingClassSectionName); 113 114 if(trainingClassSection != null) { 115 String trainingClassPageName = spec.getTrainingClassPageName(); 116 117 if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) { 118 trainingClassPage = trainingControl.getTrainingClassPageByName(trainingClassSection, trainingClassPageName); 119 } else { // EditMode.UPDATE 120 trainingClassPage = trainingControl.getTrainingClassPageByNameForUpdate(trainingClassSection, trainingClassPageName); 121 } 122 123 if(trainingClassPage != null) { 124 result.setTrainingClassPage(trainingControl.getTrainingClassPageTransfer(getUserVisit(), trainingClassPage)); 125 } else { 126 addExecutionError(ExecutionErrors.UnknownTrainingClassPageName.name(), trainingClassName, trainingClassSectionName, trainingClassPageName); 127 } 128 } else { 129 addExecutionError(ExecutionErrors.UnknownTrainingClassSectionName.name(), trainingClassName, trainingClassSectionName); 130 } 131 } else { 132 addExecutionError(ExecutionErrors.UnknownTrainingClassName.name(), trainingClassName); 133 } 134 135 return trainingClassPage; 136 } 137 138 @Override 139 public TrainingClassPage getLockEntity(TrainingClassPage trainingClassPage) { 140 return trainingClassPage; 141 } 142 143 @Override 144 public void fillInResult(EditTrainingClassPageResult result, TrainingClassPage trainingClassPage) { 145 var trainingControl = Session.getModelController(TrainingControl.class); 146 147 result.setTrainingClassPage(trainingControl.getTrainingClassPageTransfer(getUserVisit(), trainingClassPage)); 148 } 149 150 MimeType pageMimeType; 151 MimeType introductionMimeType; 152 153 @Override 154 public void doLock(TrainingClassPageEdit edit, TrainingClassPage trainingClassPage) { 155 var trainingControl = Session.getModelController(TrainingControl.class); 156 TrainingClassPageTranslation trainingClassPageTranslation = trainingControl.getTrainingClassPageTranslation(trainingClassPage, getPreferredLanguage()); 157 TrainingClassPageDetail trainingClassPageDetail = trainingClassPage.getLastDetail(); 158 159 edit.setTrainingClassPageName(trainingClassPageDetail.getTrainingClassPageName()); 160 edit.setSortOrder(trainingClassPageDetail.getSortOrder().toString()); 161 162 if(trainingClassPageTranslation != null) { 163 pageMimeType = trainingClassPageTranslation.getPageMimeType(); 164 165 edit.setDescription(trainingClassPageTranslation.getDescription()); 166 edit.setPageMimeTypeName(pageMimeType == null? null: pageMimeType.getLastDetail().getMimeTypeName()); 167 edit.setPage(trainingClassPageTranslation.getPage()); 168 } 169 } 170 171 @Override 172 public void canUpdate(TrainingClassPage trainingClassPage) { 173 var trainingControl = Session.getModelController(TrainingControl.class); 174 String trainingClassPageName = edit.getTrainingClassPageName(); 175 TrainingClassPage duplicateTrainingClassPage = trainingControl.getTrainingClassPageByName(trainingClassSection, trainingClassPageName); 176 177 if(duplicateTrainingClassPage != null && !trainingClassPage.equals(duplicateTrainingClassPage)) { 178 addExecutionError(ExecutionErrors.DuplicateTrainingClassPageName.name(), trainingClassPageName); 179 } else { 180 MimeTypeLogic mimeTypeLogic = MimeTypeLogic.getInstance(); 181 String pageMimeTypeName = edit.getPageMimeTypeName(); 182 String page = edit.getPage(); 183 184 pageMimeType = mimeTypeLogic.checkMimeType(this, pageMimeTypeName, page, MimeTypeUsageTypes.TEXT.name(), 185 ExecutionErrors.MissingRequiredPageMimeTypeName.name(), ExecutionErrors.MissingRequiredPage.name(), 186 ExecutionErrors.UnknownPageMimeTypeName.name(), ExecutionErrors.UnknownPageMimeTypeUsage.name()); 187 } 188 } 189 190 @Override 191 public void doUpdate(TrainingClassPage trainingClassPage) { 192 var trainingControl = Session.getModelController(TrainingControl.class); 193 var partyPK = getPartyPK(); 194 TrainingClassPageDetailValue trainingClassPageDetailValue = trainingControl.getTrainingClassPageDetailValueForUpdate(trainingClassPage); 195 TrainingClassPageTranslation trainingClassPageTranslation = trainingControl.getTrainingClassPageTranslationForUpdate(trainingClassPage, getPreferredLanguage()); 196 String description = edit.getDescription(); 197 String page = edit.getPage(); 198 199 trainingClassPageDetailValue.setTrainingClassPageName(edit.getTrainingClassPageName()); 200 trainingClassPageDetailValue.setSortOrder(Integer.valueOf(edit.getSortOrder())); 201 202 trainingControl.updateTrainingClassPageFromValue(trainingClassPageDetailValue, partyPK); 203 204 if(trainingClassPageTranslation == null && (description != null || page != null)) { 205 trainingControl.createTrainingClassPageTranslation(trainingClassPage, getPreferredLanguage(), description, pageMimeType, page, 206 partyPK); 207 } else if(trainingClassPageTranslation != null && (description == null && page == null)) { 208 trainingControl.deleteTrainingClassPageTranslation(trainingClassPageTranslation, partyPK); 209 } else if(trainingClassPageTranslation != null && (description != null || page != null)) { 210 TrainingClassPageTranslationValue trainingClassPageTranslationValue = trainingControl.getTrainingClassPageTranslationValue(trainingClassPageTranslation); 211 212 trainingClassPageTranslationValue.setDescription(description); 213 trainingClassPageTranslationValue.setPageMimeTypePK(pageMimeType == null? null: pageMimeType.getPrimaryKey()); 214 trainingClassPageTranslationValue.setPage(page); 215 trainingControl.updateTrainingClassPageTranslationFromValue(trainingClassPageTranslationValue, partyPK); 216 } 217 } 218 219}