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