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.sequence.server.command; 018 019import com.echothree.control.user.sequence.common.edit.SequenceEdit; 020import com.echothree.control.user.sequence.common.edit.SequenceEditFactory; 021import com.echothree.control.user.sequence.common.form.EditSequenceForm; 022import com.echothree.control.user.sequence.common.result.EditSequenceResult; 023import com.echothree.control.user.sequence.common.result.SequenceResultFactory; 024import com.echothree.control.user.sequence.common.spec.SequenceSpec; 025import com.echothree.model.control.party.common.PartyTypes; 026import com.echothree.model.control.security.common.SecurityRoleGroups; 027import com.echothree.model.control.security.common.SecurityRoles; 028import com.echothree.model.control.sequence.server.control.SequenceControl; 029import com.echothree.model.data.sequence.server.entity.Sequence; 030import com.echothree.model.data.sequence.server.entity.SequenceDescription; 031import com.echothree.model.data.sequence.server.entity.SequenceDetail; 032import com.echothree.model.data.sequence.server.entity.SequenceType; 033import com.echothree.model.data.sequence.server.value.SequenceDescriptionValue; 034import com.echothree.model.data.sequence.server.value.SequenceDetailValue; 035import com.echothree.model.data.user.common.pk.UserVisitPK; 036import com.echothree.util.common.message.ExecutionErrors; 037import com.echothree.util.common.validation.FieldDefinition; 038import com.echothree.util.common.validation.FieldType; 039import com.echothree.util.common.command.EditMode; 040import com.echothree.util.server.control.BaseAbstractEditCommand; 041import com.echothree.util.server.control.CommandSecurityDefinition; 042import com.echothree.util.server.control.PartyTypeDefinition; 043import com.echothree.util.server.control.SecurityRoleDefinition; 044import com.echothree.util.server.persistence.Session; 045import java.util.Arrays; 046import java.util.Collections; 047import java.util.List; 048 049public class EditSequenceCommand 050 extends BaseAbstractEditCommand<SequenceSpec, SequenceEdit, EditSequenceResult, Sequence, Sequence> { 051 052 private final static CommandSecurityDefinition COMMAND_SECURITY_DEFINITION; 053 private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS; 054 private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS; 055 056 static { 057 COMMAND_SECURITY_DEFINITION = new CommandSecurityDefinition(Collections.unmodifiableList(Arrays.asList( 058 new PartyTypeDefinition(PartyTypes.UTILITY.name(), null), 059 new PartyTypeDefinition(PartyTypes.EMPLOYEE.name(), Collections.unmodifiableList(Arrays.asList( 060 new SecurityRoleDefinition(SecurityRoleGroups.Sequence.name(), SecurityRoles.Edit.name()) 061 ))) 062 ))); 063 064 SPEC_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList( 065 new FieldDefinition("SequenceTypeName", FieldType.ENTITY_NAME, true, null, null), 066 new FieldDefinition("SequenceName", FieldType.ENTITY_NAME, true, null, null) 067 )); 068 069 EDIT_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList( 070 new FieldDefinition("SequenceName", FieldType.ENTITY_NAME, true, null, null), 071 new FieldDefinition("Mask", FieldType.SEQUENCE_MASK, true, null, null), 072 new FieldDefinition("ChunkSize", FieldType.UNSIGNED_INTEGER, false, null, null), 073 new FieldDefinition("IsDefault", FieldType.BOOLEAN, true, null, null), 074 new FieldDefinition("SortOrder", FieldType.SIGNED_INTEGER, true, null, null), 075 new FieldDefinition("Description", FieldType.STRING, false, 1L, 132L) 076 )); 077 } 078 079 /** Creates a new instance of EditSequenceCommand */ 080 public EditSequenceCommand(UserVisitPK userVisitPK, EditSequenceForm form) { 081 super(userVisitPK, form, COMMAND_SECURITY_DEFINITION, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS); 082 } 083 084 @Override 085 public EditSequenceResult getResult() { 086 return SequenceResultFactory.getEditSequenceResult(); 087 } 088 089 @Override 090 public SequenceEdit getEdit() { 091 return SequenceEditFactory.getSequenceEdit(); 092 } 093 094 SequenceType sequenceType = null; 095 096 @Override 097 public Sequence getEntity(EditSequenceResult result) { 098 var sequenceControl = Session.getModelController(SequenceControl.class); 099 Sequence sequence = null; 100 String sequenceTypeName = spec.getSequenceTypeName(); 101 102 sequenceType = sequenceControl.getSequenceTypeByName(sequenceTypeName); 103 104 if(sequenceType != null) { 105 String sequenceName = spec.getSequenceName(); 106 107 if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) { 108 sequence = sequenceControl.getSequenceByName(sequenceType, sequenceName); 109 } else { // EditMode.UPDATE 110 sequence = sequenceControl.getSequenceByNameForUpdate(sequenceType, sequenceName); 111 } 112 113 if(sequence != null) { 114 result.setSequence(sequenceControl.getSequenceTransfer(getUserVisit(), sequence)); 115 } else { 116 addExecutionError(ExecutionErrors.UnknownSequenceName.name(), sequenceTypeName, sequenceTypeName, sequenceName); 117 } 118 } else { 119 addExecutionError(ExecutionErrors.UnknownSequenceTypeName.name(), sequenceTypeName); 120 } 121 122 return sequence; 123 } 124 125 @Override 126 public Sequence getLockEntity(Sequence sequence) { 127 return sequence; 128 } 129 130 @Override 131 public void fillInResult(EditSequenceResult result, Sequence sequence) { 132 var sequenceControl = Session.getModelController(SequenceControl.class); 133 134 result.setSequence(sequenceControl.getSequenceTransfer(getUserVisit(), sequence)); 135 } 136 137 @Override 138 public void doLock(SequenceEdit edit, Sequence sequence) { 139 var sequenceControl = Session.getModelController(SequenceControl.class); 140 SequenceDescription sequenceDescription = sequenceControl.getSequenceDescription(sequence, getPreferredLanguage()); 141 SequenceDetail sequenceDetail = sequence.getLastDetail(); 142 Integer chunkSize = sequenceDetail.getChunkSize(); 143 144 edit.setSequenceName(sequenceDetail.getSequenceName()); 145 edit.setMask(sequenceDetail.getMask()); 146 edit.setChunkSize(chunkSize == null? null: chunkSize.toString()); 147 edit.setIsDefault(sequenceDetail.getIsDefault().toString()); 148 edit.setSortOrder(sequenceDetail.getSortOrder().toString()); 149 150 if(sequenceDescription != null) { 151 edit.setDescription(sequenceDescription.getDescription()); 152 } 153 } 154 155 @Override 156 public void canUpdate(Sequence sequence) { 157 var sequenceControl = Session.getModelController(SequenceControl.class); 158 String sequenceName = edit.getSequenceName(); 159 Sequence duplicateSequence = sequenceControl.getSequenceByName(sequenceType, sequenceName); 160 161 if(duplicateSequence != null && !sequence.equals(duplicateSequence)) { 162 addExecutionError(ExecutionErrors.DuplicateSequenceName.name(), sequenceType.getLastDetail().getSequenceTypeName(), sequenceName); 163 } 164 } 165 166 @Override 167 public void doUpdate(Sequence sequence) { 168 var sequenceControl = Session.getModelController(SequenceControl.class); 169 var partyPK = getPartyPK(); 170 SequenceDetailValue sequenceDetailValue = sequenceControl.getSequenceDetailValueForUpdate(sequence); 171 SequenceDescription sequenceDescription = sequenceControl.getSequenceDescriptionForUpdate(sequence, getPreferredLanguage()); 172 String rawChunkSize = edit.getChunkSize(); 173 Integer chunkSize = rawChunkSize == null? null: Integer.valueOf(rawChunkSize); 174 String description = edit.getDescription(); 175 176 sequenceDetailValue.setSequenceName(edit.getSequenceName()); 177 sequenceDetailValue.setMask(edit.getMask()); 178 sequenceDetailValue.setChunkSize(chunkSize); 179 sequenceDetailValue.setIsDefault(Boolean.valueOf(edit.getIsDefault())); 180 sequenceDetailValue.setSortOrder(Integer.valueOf(edit.getSortOrder())); 181 182 sequenceControl.updateSequenceFromValue(sequenceDetailValue, partyPK); 183 184 if(sequenceDescription == null && description != null) { 185 sequenceControl.createSequenceDescription(sequence, getPreferredLanguage(), description, partyPK); 186 } else if(sequenceDescription != null && description == null) { 187 sequenceControl.deleteSequenceDescription(sequenceDescription, partyPK); 188 } else if(sequenceDescription != null && description != null) { 189 SequenceDescriptionValue sequenceDescriptionValue = sequenceControl.getSequenceDescriptionValue(sequenceDescription); 190 191 sequenceDescriptionValue.setDescription(description); 192 sequenceControl.updateSequenceDescriptionFromValue(sequenceDescriptionValue, partyPK); 193 } 194 } 195 196}