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