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}