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.TrainingClassEdit; 020import com.echothree.control.user.training.common.edit.TrainingEditFactory; 021import com.echothree.control.user.training.common.form.EditTrainingClassForm; 022import com.echothree.control.user.training.common.result.EditTrainingClassResult; 023import com.echothree.control.user.training.common.result.TrainingResultFactory; 024import com.echothree.control.user.training.common.spec.TrainingClassSpec; 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.control.uom.common.UomConstants; 032import com.echothree.model.control.uom.server.logic.UnitOfMeasureTypeLogic; 033import com.echothree.model.control.workeffort.common.workeffort.TrainingConstants; 034import com.echothree.model.control.workeffort.server.control.WorkEffortControl; 035import com.echothree.model.data.core.server.entity.MimeType; 036import com.echothree.model.data.training.server.entity.TrainingClass; 037import com.echothree.model.data.training.server.entity.TrainingClassDetail; 038import com.echothree.model.data.training.server.entity.TrainingClassTranslation; 039import com.echothree.model.data.training.server.value.TrainingClassDetailValue; 040import com.echothree.model.data.training.server.value.TrainingClassTranslationValue; 041import com.echothree.model.data.user.common.pk.UserVisitPK; 042import com.echothree.model.data.workeffort.server.entity.WorkEffortScope; 043import com.echothree.model.data.workeffort.server.entity.WorkEffortType; 044import com.echothree.util.common.message.ExecutionErrors; 045import com.echothree.util.common.validation.FieldDefinition; 046import com.echothree.util.common.validation.FieldType; 047import com.echothree.util.common.command.EditMode; 048import com.echothree.util.server.control.BaseAbstractEditCommand; 049import com.echothree.util.server.control.CommandSecurityDefinition; 050import com.echothree.util.server.control.PartyTypeDefinition; 051import com.echothree.util.server.control.SecurityRoleDefinition; 052import com.echothree.util.server.persistence.Session; 053import com.echothree.util.server.string.PercentUtils; 054import java.util.Arrays; 055import java.util.Collections; 056import java.util.List; 057 058public class EditTrainingClassCommand 059 extends BaseAbstractEditCommand<TrainingClassSpec, TrainingClassEdit, EditTrainingClassResult, TrainingClass, TrainingClass> { 060 061 private final static CommandSecurityDefinition COMMAND_SECURITY_DEFINITION; 062 private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS; 063 private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS; 064 065 static { 066 COMMAND_SECURITY_DEFINITION = new CommandSecurityDefinition(Collections.unmodifiableList(Arrays.asList( 067 new PartyTypeDefinition(PartyTypes.UTILITY.name(), null), 068 new PartyTypeDefinition(PartyTypes.EMPLOYEE.name(), Collections.unmodifiableList(Arrays.asList( 069 new SecurityRoleDefinition(SecurityRoleGroups.TrainingClass.name(), SecurityRoles.Edit.name()) 070 ))) 071 ))); 072 073 SPEC_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList( 074 new FieldDefinition("TrainingClassName", FieldType.ENTITY_NAME, true, null, null) 075 )); 076 077 EDIT_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList( 078 new FieldDefinition("TrainingClassName", FieldType.ENTITY_NAME, true, null, null), 079 new FieldDefinition("EstimatedReadingTime", FieldType.UNSIGNED_LONG, false, null, null), 080 new FieldDefinition("EstimatedReadingTimeUnitOfMeasureTypeName", FieldType.ENTITY_NAME, false, null, null), 081 new FieldDefinition("ReadingTimeAllowed", FieldType.UNSIGNED_LONG, false, null, null), 082 new FieldDefinition("ReadingTimeAllowedUnitOfMeasureTypeName", FieldType.ENTITY_NAME, false, null, null), 083 new FieldDefinition("EstimatedTestingTime", FieldType.UNSIGNED_LONG, false, null, null), 084 new FieldDefinition("EstimatedTestingTimeUnitOfMeasureTypeName", FieldType.ENTITY_NAME, false, null, null), 085 new FieldDefinition("TestingTimeAllowed", FieldType.UNSIGNED_LONG, false, null, null), 086 new FieldDefinition("TestingTimeAllowedUnitOfMeasureTypeName", FieldType.ENTITY_NAME, false, null, null), 087 new FieldDefinition("RequiredCompletionTime", FieldType.UNSIGNED_LONG, false, null, null), 088 new FieldDefinition("RequiredCompletionTimeUnitOfMeasureTypeName", FieldType.ENTITY_NAME, false, null, null), 089 new FieldDefinition("WorkEffortScopeName", FieldType.ENTITY_NAME, false, null, null), 090 new FieldDefinition("DefaultPercentageToPass", FieldType.FRACTIONAL_PERCENT, false, null, null), 091 new FieldDefinition("OverallQuestionCount", FieldType.UNSIGNED_INTEGER, false, null, null), 092 new FieldDefinition("TestingValidityTime", FieldType.UNSIGNED_LONG, false, null, null), 093 new FieldDefinition("TestingValidityTimeUnitOfMeasureTypeName", FieldType.ENTITY_NAME, false, null, null), 094 new FieldDefinition("ExpiredRetentionTime", FieldType.UNSIGNED_LONG, false, null, null), 095 new FieldDefinition("ExpiredRetentionTimeUnitOfMeasureTypeName", FieldType.ENTITY_NAME, false, null, null), 096 new FieldDefinition("AlwaysReassignOnExpiration", FieldType.BOOLEAN, true, null, null), 097 new FieldDefinition("IsDefault", FieldType.BOOLEAN, true, null, null), 098 new FieldDefinition("SortOrder", FieldType.SIGNED_INTEGER, true, null, null), 099 new FieldDefinition("Description", FieldType.STRING, false, 1L, 132L), 100 new FieldDefinition("OverviewMimeTypeName", FieldType.MIME_TYPE, false, null, null), 101 new FieldDefinition("Overview", FieldType.STRING, false, null, null), 102 new FieldDefinition("IntroductionMimeTypeName", FieldType.MIME_TYPE, false, null, null), 103 new FieldDefinition("Introduction", FieldType.STRING, false, null, null) 104 )); 105 } 106 107 /** Creates a new instance of EditTrainingClassCommand */ 108 public EditTrainingClassCommand(UserVisitPK userVisitPK, EditTrainingClassForm form) { 109 super(userVisitPK, form, COMMAND_SECURITY_DEFINITION, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS); 110 } 111 112 @Override 113 public EditTrainingClassResult getResult() { 114 return TrainingResultFactory.getEditTrainingClassResult(); 115 } 116 117 @Override 118 public TrainingClassEdit getEdit() { 119 return TrainingEditFactory.getTrainingClassEdit(); 120 } 121 122 @Override 123 public TrainingClass getEntity(EditTrainingClassResult result) { 124 var trainingControl = Session.getModelController(TrainingControl.class); 125 TrainingClass trainingClass = null; 126 String trainingClassName = spec.getTrainingClassName(); 127 128 if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) { 129 trainingClass = trainingControl.getTrainingClassByName(trainingClassName); 130 } else { // EditMode.UPDATE 131 trainingClass = trainingControl.getTrainingClassByNameForUpdate(trainingClassName); 132 } 133 134 if(trainingClass != null) { 135 result.setTrainingClass(trainingControl.getTrainingClassTransfer(getUserVisit(), trainingClass)); 136 } else { 137 addExecutionError(ExecutionErrors.UnknownTrainingClassName.name(), trainingClassName); 138 } 139 140 return trainingClass; 141 } 142 143 @Override 144 public TrainingClass getLockEntity(TrainingClass trainingClass) { 145 return trainingClass; 146 } 147 148 @Override 149 public void fillInResult(EditTrainingClassResult result, TrainingClass trainingClass) { 150 var trainingControl = Session.getModelController(TrainingControl.class); 151 152 result.setTrainingClass(trainingControl.getTrainingClassTransfer(getUserVisit(), trainingClass)); 153 } 154 155 MimeType overviewMimeType; 156 MimeType introductionMimeType; 157 158 @Override 159 public void doLock(TrainingClassEdit edit, TrainingClass trainingClass) { 160 var trainingControl = Session.getModelController(TrainingControl.class); 161 UnitOfMeasureTypeLogic unitOfMeasureTypeLogic = UnitOfMeasureTypeLogic.getInstance(); 162 TrainingClassTranslation trainingClassTranslation = trainingControl.getTrainingClassTranslation(trainingClass, getPreferredLanguage()); 163 TrainingClassDetail trainingClassDetail = trainingClass.getLastDetail(); 164 WorkEffortScope workEffortScope = trainingClassDetail.getWorkEffortScope(); 165 Integer overallQuestionCount = trainingClassDetail.getOverallQuestionCount(); 166 UnitOfMeasureTypeLogic.StringUnitOfMeasure stringUnitOfMeasure; 167 168 edit.setTrainingClassName(trainingClassDetail.getTrainingClassName()); 169 stringUnitOfMeasure = unitOfMeasureTypeLogic.unitOfMeasureToString(this, UomConstants.UnitOfMeasureKindUseType_TIME, trainingClassDetail.getEstimatedReadingTime()); 170 edit.setEstimatedReadingTimeUnitOfMeasureTypeName(stringUnitOfMeasure.getUnitOfMeasureTypeName()); 171 edit.setEstimatedReadingTime(stringUnitOfMeasure.getValue()); 172 stringUnitOfMeasure = unitOfMeasureTypeLogic.unitOfMeasureToString(this, UomConstants.UnitOfMeasureKindUseType_TIME, trainingClassDetail.getReadingTimeAllowed()); 173 edit.setReadingTimeAllowedUnitOfMeasureTypeName(stringUnitOfMeasure.getUnitOfMeasureTypeName()); 174 edit.setReadingTimeAllowed(stringUnitOfMeasure.getValue()); 175 stringUnitOfMeasure = unitOfMeasureTypeLogic.unitOfMeasureToString(this, UomConstants.UnitOfMeasureKindUseType_TIME, trainingClassDetail.getEstimatedTestingTime()); 176 edit.setEstimatedTestingTimeUnitOfMeasureTypeName(stringUnitOfMeasure.getUnitOfMeasureTypeName()); 177 edit.setEstimatedTestingTime(stringUnitOfMeasure.getValue()); 178 stringUnitOfMeasure = unitOfMeasureTypeLogic.unitOfMeasureToString(this, UomConstants.UnitOfMeasureKindUseType_TIME, trainingClassDetail.getTestingTimeAllowed()); 179 edit.setTestingTimeAllowedUnitOfMeasureTypeName(stringUnitOfMeasure.getUnitOfMeasureTypeName()); 180 edit.setTestingTimeAllowed(stringUnitOfMeasure.getValue()); 181 stringUnitOfMeasure = unitOfMeasureTypeLogic.unitOfMeasureToString(this, UomConstants.UnitOfMeasureKindUseType_TIME, trainingClassDetail.getRequiredCompletionTime()); 182 edit.setRequiredCompletionTimeUnitOfMeasureTypeName(stringUnitOfMeasure.getUnitOfMeasureTypeName()); 183 edit.setRequiredCompletionTime(stringUnitOfMeasure.getValue()); 184 edit.setWorkEffortScopeName(workEffortScope == null ? null : workEffortScope.getLastDetail().getWorkEffortScopeName()); 185 edit.setDefaultPercentageToPass(PercentUtils.getInstance().formatFractionalPercent(trainingClassDetail.getDefaultPercentageToPass())); 186 edit.setOverallQuestionCount(overallQuestionCount == null? null: overallQuestionCount.toString()); 187 stringUnitOfMeasure = unitOfMeasureTypeLogic.unitOfMeasureToString(this, UomConstants.UnitOfMeasureKindUseType_TIME, trainingClassDetail.getTestingValidityTime()); 188 edit.setTestingValidityTimeUnitOfMeasureTypeName(stringUnitOfMeasure.getUnitOfMeasureTypeName()); 189 edit.setTestingValidityTime(stringUnitOfMeasure.getValue()); 190 stringUnitOfMeasure = unitOfMeasureTypeLogic.unitOfMeasureToString(this, UomConstants.UnitOfMeasureKindUseType_TIME, trainingClassDetail.getExpiredRetentionTime()); 191 edit.setExpiredRetentionTimeUnitOfMeasureTypeName(stringUnitOfMeasure.getUnitOfMeasureTypeName()); 192 edit.setExpiredRetentionTime(stringUnitOfMeasure.getValue()); 193 edit.setAlwaysReassignOnExpiration(trainingClassDetail.getAlwaysReassignOnExpiration().toString()); 194 edit.setIsDefault(trainingClassDetail.getIsDefault().toString()); 195 edit.setSortOrder(trainingClassDetail.getSortOrder().toString()); 196 197 if(trainingClassTranslation != null) { 198 overviewMimeType = trainingClassTranslation.getOverviewMimeType(); 199 introductionMimeType = trainingClassTranslation.getIntroductionMimeType(); 200 201 edit.setDescription(trainingClassTranslation.getDescription()); 202 edit.setOverviewMimeTypeName(overviewMimeType == null? null: overviewMimeType.getLastDetail().getMimeTypeName()); 203 edit.setOverview(trainingClassTranslation.getOverview()); 204 edit.setIntroductionMimeTypeName(introductionMimeType == null? null: introductionMimeType.getLastDetail().getMimeTypeName()); 205 edit.setIntroduction(trainingClassTranslation.getIntroduction()); 206 } 207 } 208 209 Long estimatedReadingTime; 210 Long readingTimeAllowed; 211 Long estimatedTestingTime; 212 Long testingTimeAllowed; 213 Long requiredCompletionTime; 214 WorkEffortScope workEffortScope; 215 Long testingValidityTime; 216 Long expiredRetentionTime; 217 218 @Override 219 public void canUpdate(TrainingClass trainingClass) { 220 var trainingControl = Session.getModelController(TrainingControl.class); 221 String trainingClassName = edit.getTrainingClassName(); 222 TrainingClass duplicateTrainingClass = trainingControl.getTrainingClassByName(trainingClassName); 223 224 if(duplicateTrainingClass != null && !trainingClass.equals(duplicateTrainingClass)) { 225 addExecutionError(ExecutionErrors.DuplicateTrainingClassName.name(), trainingClassName); 226 } else { 227 MimeTypeLogic mimeTypeLogic = MimeTypeLogic.getInstance(); 228 String overviewMimeTypeName = edit.getOverviewMimeTypeName(); 229 String overview = edit.getOverview(); 230 231 overviewMimeType = mimeTypeLogic.checkMimeType(this, overviewMimeTypeName, overview, MimeTypeUsageTypes.TEXT.name(), 232 ExecutionErrors.MissingRequiredOverviewMimeTypeName.name(), ExecutionErrors.MissingRequiredOverview.name(), 233 ExecutionErrors.UnknownOverviewMimeTypeName.name(), ExecutionErrors.UnknownOverviewMimeTypeUsage.name()); 234 235 if(!hasExecutionErrors()) { 236 String introductionMimeTypeName = edit.getIntroductionMimeTypeName(); 237 String introduction = edit.getIntroduction(); 238 239 introductionMimeType = mimeTypeLogic.checkMimeType(this, introductionMimeTypeName, introduction, MimeTypeUsageTypes.TEXT.name(), 240 ExecutionErrors.MissingRequiredIntroductionMimeTypeName.name(), ExecutionErrors.MissingRequiredIntroduction.name(), 241 ExecutionErrors.UnknownIntroductionMimeTypeName.name(), ExecutionErrors.UnknownIntroductionMimeTypeUsage.name()); 242 243 if(!hasExecutionErrors()) { 244 UnitOfMeasureTypeLogic unitOfMeasureTypeLogic = UnitOfMeasureTypeLogic.getInstance(); 245 246 estimatedReadingTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 247 edit.getEstimatedReadingTime(), edit.getEstimatedReadingTimeUnitOfMeasureTypeName(), 248 null, ExecutionErrors.MissingRequiredEstimatedReadingTime.name(), null, ExecutionErrors.MissingRequiredEstimatedReadingTimeUnitOfMeasureTypeName.name(), 249 null, ExecutionErrors.UnknownEstimatedReadingTimeUnitOfMeasureTypeName.name()); 250 251 if(!hasExecutionErrors()) { 252 readingTimeAllowed = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 253 edit.getReadingTimeAllowed(), edit.getReadingTimeAllowedUnitOfMeasureTypeName(), 254 null, ExecutionErrors.MissingRequiredReadingTimeAllowed.name(), null, ExecutionErrors.MissingRequiredReadingTimeAllowedUnitOfMeasureTypeName.name(), 255 null, ExecutionErrors.UnknownReadingTimeAllowedUnitOfMeasureTypeName.name()); 256 257 if(!hasExecutionErrors()) { 258 estimatedTestingTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 259 edit.getEstimatedTestingTime(), edit.getEstimatedTestingTimeUnitOfMeasureTypeName(), 260 null, ExecutionErrors.MissingRequiredEstimatedTestingTime.name(), null, ExecutionErrors.MissingRequiredEstimatedTestingTimeUnitOfMeasureTypeName.name(), 261 null, ExecutionErrors.UnknownEstimatedTestingTimeUnitOfMeasureTypeName.name()); 262 263 if(!hasExecutionErrors()) { 264 testingTimeAllowed = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 265 edit.getTestingTimeAllowed(), edit.getTestingTimeAllowedUnitOfMeasureTypeName(), 266 null, ExecutionErrors.MissingRequiredTestingTimeAllowed.name(), null, ExecutionErrors.MissingRequiredTestingTimeAllowedUnitOfMeasureTypeName.name(), 267 null, ExecutionErrors.UnknownTestingTimeAllowedUnitOfMeasureTypeName.name()); 268 269 if(!hasExecutionErrors()) { 270 requiredCompletionTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 271 edit.getRequiredCompletionTime(), edit.getRequiredCompletionTimeUnitOfMeasureTypeName(), 272 null, ExecutionErrors.MissingRequiredRequiredCompletionTime.name(), null, ExecutionErrors.MissingRequiredRequiredCompletionTimeUnitOfMeasureTypeName.name(), 273 null, ExecutionErrors.UnknownRequiredCompletionTimeUnitOfMeasureTypeName.name()); 274 275 if(!hasExecutionErrors()) { 276 String workEffortScopeName = edit.getWorkEffortScopeName(); 277 278 if(workEffortScopeName != null) { 279 var workEffortControl = Session.getModelController(WorkEffortControl.class); 280 WorkEffortType workEffortType = workEffortControl.getWorkEffortTypeByName(TrainingConstants.WorkEffortType_TRAINING); 281 282 if(workEffortType != null) { 283 workEffortScope = workEffortControl.getWorkEffortScopeByName(workEffortType, workEffortScopeName); 284 285 if(workEffortScope == null) { 286 addExecutionError(ExecutionErrors.UnknownWorkEffortScopeName.name(), TrainingConstants.WorkEffortType_TRAINING, 287 workEffortScopeName); 288 } 289 } else { 290 addExecutionError(ExecutionErrors.UnknownWorkEffortTypeName.name(), TrainingConstants.WorkEffortType_TRAINING); 291 } 292 } 293 294 if(!hasExecutionErrors()) { 295 testingValidityTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 296 edit.getTestingValidityTime(), edit.getTestingValidityTimeUnitOfMeasureTypeName(), 297 null, ExecutionErrors.MissingRequiredTestingValidityTime.name(), null, ExecutionErrors.MissingRequiredTestingValidityTimeUnitOfMeasureTypeName.name(), 298 null, ExecutionErrors.UnknownTestingValidityTimeUnitOfMeasureTypeName.name()); 299 300 if(!hasExecutionErrors()) { 301 expiredRetentionTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 302 edit.getExpiredRetentionTime(), edit.getExpiredRetentionTimeUnitOfMeasureTypeName(), 303 null, ExecutionErrors.MissingRequiredExpiredRetentionTime.name(), null, ExecutionErrors.MissingRequiredExpiredRetentionTimeUnitOfMeasureTypeName.name(), 304 null, ExecutionErrors.UnknownExpiredRetentionTimeUnitOfMeasureTypeName.name()); 305 } 306 } 307 } 308 } 309 } 310 } 311 } 312 } 313 } 314 } 315 } 316 317 @Override 318 public void doUpdate(TrainingClass trainingClass) { 319 var trainingControl = Session.getModelController(TrainingControl.class); 320 var partyPK = getPartyPK(); 321 TrainingClassDetailValue trainingClassDetailValue = trainingControl.getTrainingClassDetailValueForUpdate(trainingClass); 322 TrainingClassTranslation trainingClassTranslation = trainingControl.getTrainingClassTranslationForUpdate(trainingClass, getPreferredLanguage()); 323 String defaultPercentageToPass = edit.getDefaultPercentageToPass(); 324 String overallQuestionCount = edit.getOverallQuestionCount(); 325 String description = edit.getDescription(); 326 String overview = edit.getOverview(); 327 String introduction = edit.getIntroduction(); 328 329 trainingClassDetailValue.setTrainingClassName(edit.getTrainingClassName()); 330 trainingClassDetailValue.setEstimatedReadingTime(estimatedReadingTime); 331 trainingClassDetailValue.setReadingTimeAllowed(readingTimeAllowed); 332 trainingClassDetailValue.setEstimatedTestingTime(estimatedTestingTime); 333 trainingClassDetailValue.setTestingTimeAllowed(testingTimeAllowed); 334 trainingClassDetailValue.setRequiredCompletionTime(requiredCompletionTime); 335 trainingClassDetailValue.setWorkEffortScopePK(workEffortScope == null ? null : workEffortScope.getPrimaryKey()); 336 trainingClassDetailValue.setDefaultPercentageToPass(defaultPercentageToPass == null? null: Integer.valueOf(defaultPercentageToPass)); 337 trainingClassDetailValue.setOverallQuestionCount(overallQuestionCount == null? null: Integer.valueOf(overallQuestionCount)); 338 trainingClassDetailValue.setTestingValidityTime(testingValidityTime); 339 trainingClassDetailValue.setExpiredRetentionTime(expiredRetentionTime); 340 trainingClassDetailValue.setAlwaysReassignOnExpiration(Boolean.valueOf(edit.getAlwaysReassignOnExpiration())); 341 trainingClassDetailValue.setIsDefault(Boolean.valueOf(edit.getIsDefault())); 342 trainingClassDetailValue.setSortOrder(Integer.valueOf(edit.getSortOrder())); 343 344 trainingControl.updateTrainingClassFromValue(trainingClassDetailValue, partyPK); 345 346 if(trainingClassTranslation == null && (description != null || overview != null || introduction != null)) { 347 trainingControl.createTrainingClassTranslation(trainingClass, getPreferredLanguage(), description, overviewMimeType, overview, introductionMimeType, 348 introduction, partyPK); 349 } else if(trainingClassTranslation != null && (description == null && overview == null && introduction == null)) { 350 trainingControl.deleteTrainingClassTranslation(trainingClassTranslation, partyPK); 351 } else if(trainingClassTranslation != null && (description != null || overview != null || introduction != null)) { 352 TrainingClassTranslationValue trainingClassTranslationValue = trainingControl.getTrainingClassTranslationValue(trainingClassTranslation); 353 354 trainingClassTranslationValue.setDescription(description); 355 trainingClassTranslationValue.setOverviewMimeTypePK(overviewMimeType == null? null: overviewMimeType.getPrimaryKey()); 356 trainingClassTranslationValue.setOverview(overview); 357 trainingClassTranslationValue.setIntroductionMimeTypePK(introductionMimeType == null? null: introductionMimeType.getPrimaryKey()); 358 trainingClassTranslationValue.setIntroduction(introduction); 359 trainingControl.updateTrainingClassTranslationFromValue(trainingClassTranslationValue, partyPK); 360 } 361 } 362 363}