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.search.server.logic; 018 019import com.echothree.control.user.search.common.spec.SearchSortOrderUniversalSpec; 020import com.echothree.model.control.core.common.ComponentVendors; 021import com.echothree.model.control.core.common.EntityTypes; 022import com.echothree.model.control.core.common.exception.InvalidParameterCountException; 023import com.echothree.model.control.core.server.logic.EntityInstanceLogic; 024import com.echothree.model.control.search.common.exception.DuplicateSearchSortOrderNameException; 025import com.echothree.model.control.search.common.exception.UnknownDefaultSearchKindException; 026import com.echothree.model.control.search.common.exception.UnknownDefaultSearchSortOrderException; 027import com.echothree.model.control.search.common.exception.UnknownSearchSortOrderNameException; 028import com.echothree.model.control.search.server.control.SearchControl; 029import com.echothree.model.data.party.server.entity.Language; 030import com.echothree.model.data.search.server.entity.SearchKind; 031import com.echothree.model.data.search.server.entity.SearchSortOrder; 032import com.echothree.util.common.message.ExecutionErrors; 033import com.echothree.util.common.persistence.BasePK; 034import com.echothree.util.server.control.BaseLogic; 035import com.echothree.util.server.message.ExecutionErrorAccumulator; 036import com.echothree.util.server.persistence.EntityPermission; 037import com.echothree.util.server.validation.ParameterUtils; 038import javax.enterprise.context.ApplicationScoped; 039import javax.enterprise.inject.spi.CDI; 040import javax.inject.Inject; 041 042@ApplicationScoped 043public class SearchSortOrderLogic 044 extends BaseLogic { 045 046 @Inject 047 SearchControl searchControl; 048 049 @Inject 050 EntityInstanceLogic entityInstanceLogic; 051 052 @Inject 053 SearchKindLogic searchKindLogic; 054 055 protected SearchSortOrderLogic() { 056 super(); 057 } 058 059 public static SearchSortOrderLogic getInstance() { 060 return CDI.current().select(SearchSortOrderLogic.class).get(); 061 } 062 063 public SearchSortOrder createSearchSortOrder(final ExecutionErrorAccumulator eea, final String searchKindName, final String searchSortOrderName, 064 final Boolean isDefault, final Integer sortOrder, final Language language, final String description, final BasePK createdBy) { 065 var searchKind = searchKindLogic.getSearchKindByName(eea, searchKindName); 066 SearchSortOrder searchSortOrder = null; 067 068 if(eea == null || !eea.hasExecutionErrors()) { 069 searchSortOrder = createSearchSortOrder(eea, searchKind, searchSortOrderName, isDefault, sortOrder, language, description, createdBy); 070 } 071 072 return searchSortOrder; 073 } 074 075 public SearchSortOrder createSearchSortOrder(final ExecutionErrorAccumulator eea, final SearchKind searchKind, final String searchSortOrderName, 076 final Boolean isDefault, final Integer sortOrder, final Language language, final String description, final BasePK createdBy) { 077 var searchSortOrder = searchControl.getSearchSortOrderByName(searchKind, searchSortOrderName); 078 079 if(searchSortOrder == null) { 080 searchSortOrder = searchControl.createSearchSortOrder(searchKind, searchSortOrderName, isDefault, sortOrder, createdBy); 081 082 if(description != null) { 083 searchControl.createSearchSortOrderDescription(searchSortOrder, language, description, createdBy); 084 } 085 } else { 086 handleExecutionError(DuplicateSearchSortOrderNameException.class, eea, ExecutionErrors.DuplicateSearchSortOrderName.name(), searchSortOrderName); 087 } 088 return searchSortOrder; 089 } 090 091 public SearchSortOrder getSearchSortOrderByName(final ExecutionErrorAccumulator eea, final SearchKind searchKind, final String searchSortOrderName, 092 final EntityPermission entityPermission) { 093 var searchSortOrder = searchControl.getSearchSortOrderByName(searchKind, searchSortOrderName, entityPermission); 094 095 if(searchSortOrder == null) { 096 handleExecutionError(UnknownSearchSortOrderNameException.class, eea, ExecutionErrors.UnknownSearchSortOrderName.name(), 097 searchKind.getLastDetail().getSearchKindName(), searchSortOrderName); 098 } 099 100 return searchSortOrder; 101 } 102 103 public SearchSortOrder getSearchSortOrderByName(final ExecutionErrorAccumulator eea, final SearchKind searchKind, final String searchSortOrderName) { 104 return getSearchSortOrderByName(eea, searchKind, searchSortOrderName, EntityPermission.READ_ONLY); 105 } 106 107 public SearchSortOrder getSearchSortOrderByNameForUpdate(final ExecutionErrorAccumulator eea, final SearchKind searchKind, final String searchSortOrderName) { 108 return getSearchSortOrderByName(eea, searchKind, searchSortOrderName, EntityPermission.READ_WRITE); 109 } 110 111 public SearchSortOrder getSearchSortOrderByName(final ExecutionErrorAccumulator eea, final String searchKindName, final String searchSortOrderName, 112 final EntityPermission entityPermission) { 113 var searchKind = searchKindLogic.getSearchKindByName(eea, searchKindName); 114 SearchSortOrder searchSortOrder = null; 115 116 if(eea == null || !eea.hasExecutionErrors()) { 117 searchSortOrder = getSearchSortOrderByName(eea, searchKind, searchSortOrderName, entityPermission); 118 } 119 120 return searchSortOrder; 121 } 122 123 public SearchSortOrder getSearchSortOrderByName(final ExecutionErrorAccumulator eea, final String searchKindName, final String searchSortOrderName) { 124 return getSearchSortOrderByName(eea, searchKindName, searchSortOrderName, EntityPermission.READ_ONLY); 125 } 126 127 public SearchSortOrder getSearchSortOrderByNameForUpdate(final ExecutionErrorAccumulator eea, final String searchKindName, final String searchSortOrderName) { 128 return getSearchSortOrderByName(eea, searchKindName, searchSortOrderName, EntityPermission.READ_WRITE); 129 } 130 131 public SearchSortOrder getSearchSortOrderByUniversalSpec(final ExecutionErrorAccumulator eea, final SearchSortOrderUniversalSpec universalSpec, 132 final boolean allowDefault, final EntityPermission entityPermission) { 133 var searchKindName = universalSpec.getSearchKindName(); 134 var searchSortOrderName = universalSpec.getSearchSortOrderName(); 135 var nameParameterCount= ParameterUtils.getInstance().countNonNullParameters(searchKindName, searchSortOrderName); 136 var possibleEntitySpecs= entityInstanceLogic.countPossibleEntitySpecs(universalSpec); 137 SearchSortOrder searchSortOrder = null; 138 139 if(nameParameterCount < 3 && possibleEntitySpecs == 0) { 140 SearchKind searchKind = null; 141 142 if(searchKindName == null) { 143 if(allowDefault) { 144 searchKind = searchControl.getDefaultSearchKind(); 145 146 if(searchKind == null) { 147 handleExecutionError(UnknownDefaultSearchKindException.class, eea, ExecutionErrors.UnknownDefaultSearchKind.name()); 148 } 149 } else { 150 handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name()); 151 } 152 } else { 153 searchKind = searchKindLogic.getSearchKindByName(eea, searchKindName); 154 } 155 156 if(eea == null || !eea.hasExecutionErrors()) { 157 if(searchSortOrderName == null) { 158 if(allowDefault) { 159 searchSortOrder = searchControl.getDefaultSearchSortOrder(searchKind, entityPermission); 160 161 if(searchSortOrder == null) { 162 handleExecutionError(UnknownDefaultSearchSortOrderException.class, eea, ExecutionErrors.UnknownDefaultSearchSortOrder.name()); 163 } 164 } else { 165 handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name()); 166 } 167 } else { 168 searchSortOrder = getSearchSortOrderByName(eea, searchKind, searchSortOrderName, entityPermission); 169 } 170 } 171 } else if(nameParameterCount == 0 && possibleEntitySpecs == 1) { 172 var entityInstance = entityInstanceLogic.getEntityInstance(eea, universalSpec, 173 ComponentVendors.ECHO_THREE.name(), EntityTypes.SearchSortOrder.name()); 174 175 if(eea == null || !eea.hasExecutionErrors()) { 176 searchSortOrder = searchControl.getSearchSortOrderByEntityInstance(entityInstance, entityPermission); 177 } 178 } else { 179 handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name()); 180 } 181 182 return searchSortOrder; 183 } 184 185 public SearchSortOrder getSearchSortOrderByUniversalSpec(final ExecutionErrorAccumulator eea, final SearchSortOrderUniversalSpec universalSpec, 186 boolean allowDefault) { 187 return getSearchSortOrderByUniversalSpec(eea, universalSpec, allowDefault, EntityPermission.READ_ONLY); 188 } 189 190 public SearchSortOrder getSearchSortOrderByUniversalSpecForUpdate(final ExecutionErrorAccumulator eea, final SearchSortOrderUniversalSpec universalSpec, 191 boolean allowDefault) { 192 return getSearchSortOrderByUniversalSpec(eea, universalSpec, allowDefault, EntityPermission.READ_WRITE); 193 } 194 195 public void deleteSearchSortOrder(final ExecutionErrorAccumulator eea, final SearchSortOrder searchSortOrder, 196 final BasePK deletedBy) { 197 searchControl.deleteSearchSortOrder(searchSortOrder, deletedBy); 198 } 199}