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