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