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.model.control.chain.server.logic; 018 019import com.echothree.control.user.chain.common.spec.ChainActionUniversalSpec; 020import com.echothree.model.control.chain.common.exception.UnknownChainActionNameException; 021import com.echothree.model.control.chain.common.exception.UnknownDefaultChainActionSetException; 022import com.echothree.model.control.chain.common.exception.UnknownDefaultChainException; 023import com.echothree.model.control.chain.common.exception.UnknownDefaultChainKindException; 024import com.echothree.model.control.chain.common.exception.UnknownDefaultChainTypeException; 025import com.echothree.model.control.chain.server.control.ChainControl; 026import com.echothree.model.control.core.common.ComponentVendors; 027import com.echothree.model.control.core.common.EntityTypes; 028import com.echothree.model.control.core.common.exception.InvalidParameterCountException; 029import com.echothree.model.control.core.server.logic.EntityInstanceLogic; 030import com.echothree.model.data.chain.server.entity.Chain; 031import com.echothree.model.data.chain.server.entity.ChainAction; 032import com.echothree.model.data.chain.server.entity.ChainActionSet; 033import com.echothree.model.data.chain.server.entity.ChainKind; 034import com.echothree.model.data.chain.server.entity.ChainType; 035import com.echothree.util.common.message.ExecutionErrors; 036import com.echothree.util.server.control.BaseLogic; 037import com.echothree.util.server.message.ExecutionErrorAccumulator; 038import com.echothree.util.server.persistence.EntityPermission; 039import com.echothree.util.server.validation.ParameterUtils; 040import javax.enterprise.context.ApplicationScoped; 041import javax.inject.Inject; 042 043@ApplicationScoped 044public class ChainActionLogic 045 extends BaseLogic { 046 047 @Inject 048 ParameterUtils parameterUtils; 049 @Inject 050 ChainControl chainControl; 051 052 @Inject 053 ChainActionSetLogic chainActionSetLogic; 054 055 @Inject 056 ChainKindLogic chainKindLogic; 057 058 @Inject 059 ChainLogic chainLogic; 060 061 @Inject 062 ChainTypeLogic chainTypeLogic; 063 064 @Inject 065 EntityInstanceLogic entityInstanceLogic; 066 067 protected ChainActionLogic() { 068 super(); 069 } 070 071 public ChainAction getChainActionByName(final ExecutionErrorAccumulator eea, final ChainActionSet chainActionSet, final String chainActionName, 072 final EntityPermission entityPermission) { 073 var chainAction = entityPermission == EntityPermission.READ_WRITE 074 ? chainControl.getChainActionByNameForUpdate(chainActionSet, chainActionName) 075 : chainControl.getChainActionByName(chainActionSet, chainActionName); 076 077 if(chainAction == null) { 078 handleExecutionError(UnknownChainActionNameException.class, eea, ExecutionErrors.UnknownChainActionName.name(), 079 chainActionSet.getLastDetail().getChain().getLastDetail().getChainType().getLastDetail().getChainKind().getLastDetail().getChainKindName(), 080 chainActionSet.getLastDetail().getChain().getLastDetail().getChainType().getLastDetail().getChainTypeName(), 081 chainActionSet.getLastDetail().getChain().getLastDetail().getChainName(), 082 chainActionSet.getLastDetail().getChainActionSetName(), 083 chainActionName); 084 } 085 086 return chainAction; 087 } 088 089 public ChainAction getChainActionByName(final ExecutionErrorAccumulator eea, final ChainActionSet chainActionSet, final String chainActionName) { 090 return getChainActionByName(eea, chainActionSet, chainActionName, EntityPermission.READ_ONLY); 091 } 092 093 public ChainAction getChainActionByNameForUpdate(final ExecutionErrorAccumulator eea, final ChainActionSet chainActionSet, final String chainActionName) { 094 return getChainActionByName(eea, chainActionSet, chainActionName, EntityPermission.READ_WRITE); 095 } 096 097 public ChainAction getChainActionByName(final ExecutionErrorAccumulator eea, final String chainKindName, 098 final String chainTypeName, final String chainName, final String chainActionSetName, final String chainActionName, 099 final EntityPermission entityPermission) { 100 var chainActionSet = chainActionSetLogic.getChainActionSetByName(eea, chainKindName, chainTypeName, chainName, chainActionSetName); 101 ChainAction chainAction = null; 102 103 if(!hasExecutionErrors(eea)) { 104 chainAction = getChainActionByName(eea, chainActionSet, chainActionName, entityPermission); 105 } 106 107 return chainAction; 108 } 109 110 public ChainAction getChainActionByName(final ExecutionErrorAccumulator eea, final String chainKindName, 111 final String chainTypeName, final String chainName, final String chainActionSetName, final String chainActionName) { 112 return getChainActionByName(eea, chainKindName, chainTypeName, chainName, chainActionSetName, chainActionName, EntityPermission.READ_ONLY); 113 } 114 115 public ChainAction getChainActionByNameForUpdate(final ExecutionErrorAccumulator eea, final String chainKindName, 116 final String chainTypeName, final String chainName, final String chainActionSetName, final String chainActionName) { 117 return getChainActionByName(eea, chainKindName, chainTypeName, chainName, chainActionSetName, chainActionName, EntityPermission.READ_WRITE); 118 } 119 120 public ChainAction getChainActionByUniversalSpec(final ExecutionErrorAccumulator eea, 121 final ChainActionUniversalSpec universalSpec, final boolean allowDefault, final EntityPermission entityPermission) { 122 var chainKindName = universalSpec.getChainKindName(); 123 var chainTypeName = universalSpec.getChainTypeName(); 124 var chainName = universalSpec.getChainName(); 125 var chainActionSetName = universalSpec.getChainActionSetName(); 126 var chainActionName = universalSpec.getChainActionName(); 127 var nameParameterCount = parameterUtils.countNonNullParameters(chainKindName, chainTypeName, chainName, chainActionSetName, chainActionName); 128 var possibleEntitySpecs = entityInstanceLogic.countPossibleEntitySpecs(universalSpec); 129 ChainAction chainAction = null; 130 131 if(nameParameterCount != 0 && possibleEntitySpecs == 0) { 132 ChainKind chainKind = null; 133 ChainType chainType = null; 134 Chain chain = null; 135 ChainActionSet chainActionSet = null; 136 137 if(chainKindName == null) { 138 if(allowDefault) { 139 chainKind = chainControl.getDefaultChainKind(); 140 141 if(chainKind == null) { 142 handleExecutionError(UnknownDefaultChainKindException.class, eea, ExecutionErrors.UnknownDefaultChainKind.name()); 143 } 144 } else { 145 handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name()); 146 } 147 } else { 148 chainKind = chainKindLogic.getChainKindByName(eea, chainKindName); 149 } 150 151 if(eea == null || !eea.hasExecutionErrors()) { 152 if(chainTypeName == null) { 153 if(allowDefault) { 154 chainType = chainControl.getDefaultChainType(chainKind); 155 156 if(chainType == null) { 157 handleExecutionError(UnknownDefaultChainTypeException.class, eea, ExecutionErrors.UnknownDefaultChainType.name(), 158 chainKind.getLastDetail().getChainKindName()); 159 } 160 } else { 161 handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name()); 162 } 163 } else { 164 chainType = chainTypeLogic.getChainTypeByName(eea, chainKind, chainTypeName); 165 } 166 } 167 168 if(eea == null || !eea.hasExecutionErrors()) { 169 if(chainName == null) { 170 if(allowDefault) { 171 chain = chainControl.getDefaultChain(chainType, entityPermission); 172 173 if(chain == null) { 174 handleExecutionError(UnknownDefaultChainException.class, eea, ExecutionErrors.UnknownDefaultChain.name(), 175 chainKind.getLastDetail().getChainKindName(), 176 chainType.getLastDetail().getChainTypeName()); 177 } 178 } else { 179 handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name()); 180 } 181 } else { 182 chain = chainLogic.getChainByName(eea, chainType, chainName, entityPermission); 183 } 184 } 185 186 if(eea == null || !eea.hasExecutionErrors()) { 187 if(chainActionSetName == null) { 188 if(allowDefault) { 189 chainActionSet = chainControl.getDefaultChainActionSet(chain, entityPermission); 190 191 if(chainActionSet == null) { 192 handleExecutionError(UnknownDefaultChainActionSetException.class, eea, ExecutionErrors.UnknownDefaultChainActionSet.name(), 193 chain.getLastDetail().getChainType().getLastDetail().getChainKind().getLastDetail().getChainKindName(), 194 chain.getLastDetail().getChainType().getLastDetail().getChainTypeName(), 195 chain.getLastDetail().getChainName()); 196 } 197 } else { 198 handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name()); 199 } 200 } else { 201 chainActionSet = chainActionSetLogic.getChainActionSetByName(eea, chain, chainActionSetName, entityPermission); 202 } 203 } 204 205 if(eea == null || !eea.hasExecutionErrors()) { 206 if(chainActionName != null) { 207 chainAction = getChainActionByName(eea, chainActionSet, chainActionName, entityPermission); 208 } else { 209 handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name()); 210 } 211 } 212 } else if(nameParameterCount == 0 && possibleEntitySpecs == 1) { 213 var entityInstance = entityInstanceLogic.getEntityInstance(eea, universalSpec, 214 ComponentVendors.ECHO_THREE.name(), EntityTypes.ChainAction.name()); 215 216 if(eea == null || !eea.hasExecutionErrors()) { 217 chainAction = chainControl.getChainActionByEntityInstance(entityInstance, entityPermission); 218 } 219 } else { 220 handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name()); 221 } 222 223 return chainAction; 224 } 225 226 public ChainAction getChainActionByUniversalSpec(final ExecutionErrorAccumulator eea, 227 final ChainActionUniversalSpec universalSpec, final boolean allowDefault) { 228 return getChainActionByUniversalSpec(eea, universalSpec, allowDefault, EntityPermission.READ_ONLY); 229 } 230 231 public ChainAction getChainActionByUniversalSpecForUpdate(final ExecutionErrorAccumulator eea, 232 final ChainActionUniversalSpec universalSpec, final boolean allowDefault) { 233 return getChainActionByUniversalSpec(eea, universalSpec, allowDefault, EntityPermission.READ_WRITE); 234 } 235 236}