001// -------------------------------------------------------------------------------- 002// Copyright 2002-2024 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.selector.server.evaluator; 018 019import com.echothree.model.control.selector.common.SelectorKinds; 020import com.echothree.model.control.selector.server.control.SelectorControl; 021import com.echothree.model.data.selector.server.entity.Selector; 022import com.echothree.model.data.selector.server.entity.SelectorDetail; 023import com.echothree.model.data.selector.server.entity.SelectorNode; 024import com.echothree.model.data.selector.server.entity.SelectorNodeBoolean; 025import com.echothree.model.data.selector.server.entity.SelectorNodeDetail; 026import com.echothree.model.data.selector.server.entity.SelectorNodeEntityListItem; 027import com.echothree.model.data.selector.server.entity.SelectorNodeGeoCode; 028import com.echothree.model.data.selector.server.entity.SelectorNodeItemAccountingCategory; 029import com.echothree.model.data.selector.server.entity.SelectorNodeItemCategory; 030import com.echothree.model.data.selector.server.entity.SelectorNodeItemPurchasingCategory; 031import com.echothree.model.data.selector.server.entity.SelectorNodeResponsibilityType; 032import com.echothree.model.data.selector.server.entity.SelectorNodeSkillType; 033import com.echothree.model.data.selector.server.entity.SelectorNodeTrainingClass; 034import com.echothree.model.data.selector.server.entity.SelectorNodeWorkflowStep; 035import com.echothree.util.server.persistence.Session; 036import java.util.HashMap; 037import java.util.List; 038import java.util.Map; 039 040public class CachedSelector { 041 042 SelectorControl selectorControl = Session.getModelController(SelectorControl.class); 043 044 Selector selector; 045 046 SelectorNodeDetail rootSelectorNodeDetail; 047 048 Map<SelectorNode, SelectorNodeDetail> selectorNodes; 049 Map<SelectorNode, SelectorNodeBoolean> selectorNodeBooleans; 050 Map<SelectorNode, SelectorNodeEntityListItem> selectorNodeEntityListItems; 051 Map<SelectorNode, SelectorNodeWorkflowStep> selectorNodeWorkflowSteps; 052 Map<SelectorNode, SelectorNodeResponsibilityType> selectorNodeResponsibilityTypes; 053 Map<SelectorNode, SelectorNodeSkillType> selectorNodeSkillTypes; 054 Map<SelectorNode, SelectorNodeTrainingClass> selectorNodeTrainingClasses; 055 Map<SelectorNode, SelectorNodeGeoCode> selectorNodeGeoCodes; 056 Map<SelectorNode, SelectorNodeItemCategory> selectorNodeItemCategories; 057 Map<SelectorNode, SelectorNodeItemAccountingCategory> selectorNodeItemAccountingCategories; 058 Map<SelectorNode, SelectorNodeItemPurchasingCategory> selectorNodeItemPurchasingCategories; 059 060 /** Create a new instance of CachedSelector and fill in the details that are cached for the Selector */ 061 /** Creates a new instance of CachedSelector */ 062 public CachedSelector(Selector selector) { 063 init(selector); 064 } 065 066 private void init(final Selector selector) { 067 SelectorDetail selectorDetail = selector.getLastDetail(); 068 String selectorKindName = selectorDetail.getSelectorType().getLastDetail().getSelectorKind().getLastDetail().getSelectorKindName(); 069 070 this.selector = selector; 071 072 cacheSelectorNodes(); 073 cacheSelectorNodeBooleans(); 074 cacheSelectorNodeEntityListItems(); 075 cacheSelectorNodeWorkflowSteps(); 076 077 if(selectorKindName.equals(SelectorKinds.CUSTOMER.name()) || 078 selectorKindName.equals(SelectorKinds.EMPLOYEE.name()) || 079 selectorKindName.equals(SelectorKinds.VENDOR.name())) { 080 cacheSelectorNodeResponsibilityTypes(); 081 cacheSelectorNodeSkillTypes(); 082 cacheSelectorNodeTrainingClasses(); 083 } 084 085 if(selectorKindName.equals(SelectorKinds.POSTAL_ADDRESS.name())) { 086 cacheSelectorNodeGeoCodes(); 087 } 088 089 if(selectorKindName.equals(SelectorKinds.ITEM.name())) { 090 cacheSelectorNodeItemCategories(); 091 cacheSelectorNodeItemAccountingCategories(); 092 cacheSelectorNodeItemPurchasingCategories(); 093 } 094 } 095 096 /** Copy the rawSelectorNodes into the selectorNodes Map that uses the SelectorNode as the key, and 097 * the SelectorNodeDetail as the value. 098 */ 099 private void cacheSelectorNodes() { 100 List<SelectorNode> rawSelectorNodes = selectorControl.getSelectorNodesBySelector(selector); 101 int size = rawSelectorNodes.size(); 102 103 selectorNodes = new HashMap<>(size); 104 105 if(size > 0) { 106 rawSelectorNodes.forEach((selectorNode) -> { 107 SelectorNodeDetail selectorNodeDetail = selectorNode.getLastDetail(); 108 109 if(selectorNodeDetail.getIsRootSelectorNode()) { 110 rootSelectorNodeDetail = selectorNodeDetail; 111 } 112 113 selectorNodes.put(selectorNode, selectorNodeDetail); 114 }); 115 } 116 } 117 118 /** Copy rawSelectorNodeBooleans into the selectorNodeBooleans Map, SelectorNode is the key, 119 * SelectorNodeBoolean is the value. 120 */ 121 private void cacheSelectorNodeBooleans() { 122 List<SelectorNodeBoolean> rawSelectorNodeBooleans = selectorControl.getSelectorNodeBooleansBySelector(selector); 123 int size = rawSelectorNodeBooleans.size(); 124 125 if(size > 0) { 126 selectorNodeBooleans = new HashMap<>(size); 127 128 rawSelectorNodeBooleans.forEach((selectorNodeBoolean) -> { 129 selectorNodeBooleans.put(selectorNodeBoolean.getSelectorNode(), selectorNodeBoolean); 130 }); 131 } else 132 selectorNodeBooleans = null; 133 } 134 135 /** Copy rawSelectorNodeEntityListItems into the selectorNodeEntityListItems Map, SelectorNode is the key, 136 * SelectorNodeEntityListItem is the value. 137 */ 138 private void cacheSelectorNodeEntityListItems() { 139 List<SelectorNodeEntityListItem> rawSelectorNodeEntityListItems = selectorControl.getSelectorNodeEntityListItemsBySelector(selector); 140 int size = rawSelectorNodeEntityListItems.size(); 141 142 if(size > 0) { 143 selectorNodeEntityListItems = new HashMap<>(size); 144 145 rawSelectorNodeEntityListItems.forEach((selectorNodeEntityListItem) -> { 146 selectorNodeEntityListItems.put(selectorNodeEntityListItem.getSelectorNode(), selectorNodeEntityListItem); 147 }); 148 } else 149 selectorNodeEntityListItems = null; 150 } 151 152 /** Copy rawSelectorNodeWorkflowSteps into the selectorNodeWorkflowSteps Map, SelectorNode is the key, 153 * SelectorNodeWorkflowStep is the value. 154 */ 155 private void cacheSelectorNodeWorkflowSteps() { 156 List<SelectorNodeWorkflowStep> rawSelectorNodeWorkflowSteps = selectorControl.getSelectorNodeWorkflowStepsBySelector(selector); 157 int size = rawSelectorNodeWorkflowSteps.size(); 158 159 if(size > 0) { 160 selectorNodeWorkflowSteps = new HashMap<>(size); 161 162 rawSelectorNodeWorkflowSteps.forEach((selectorNodeWorkflowStep) -> { 163 selectorNodeWorkflowSteps.put(selectorNodeWorkflowStep.getSelectorNode(), selectorNodeWorkflowStep); 164 }); 165 } else 166 selectorNodeWorkflowSteps = null; 167 } 168 169 /** Copy rawSelectorNodeResponsibilityTypes into the selectorNodeResponsibilityTypes Map, SelectorNode is the key, 170 * SelectorNodeResponsibilityType is the value. 171 */ 172 private void cacheSelectorNodeResponsibilityTypes() { 173 List<SelectorNodeResponsibilityType> rawSelectorNodeResponsibilityTypes = selectorControl.getSelectorNodeResponsibilityTypesBySelector(selector); 174 int size = rawSelectorNodeResponsibilityTypes.size(); 175 176 if(size > 0) { 177 selectorNodeResponsibilityTypes = new HashMap<>(size); 178 179 rawSelectorNodeResponsibilityTypes.forEach((selectorNodeResponsibilityType) -> { 180 selectorNodeResponsibilityTypes.put(selectorNodeResponsibilityType.getSelectorNode(), selectorNodeResponsibilityType); 181 }); 182 } else 183 selectorNodeResponsibilityTypes = null; 184 } 185 186 /** Copy rawSelectorNodeSkillTypes into the selectorNodeSkillTypes Map, SelectorNode is the key, 187 * SelectorNodeSkillType is the value. 188 */ 189 private void cacheSelectorNodeSkillTypes() { 190 List<SelectorNodeSkillType> rawSelectorNodeSkillTypes = selectorControl.getSelectorNodeSkillTypesBySelector(selector); 191 int size = rawSelectorNodeSkillTypes.size(); 192 193 if(size > 0) { 194 selectorNodeSkillTypes = new HashMap<>(size); 195 196 rawSelectorNodeSkillTypes.forEach((selectorNodeSkillType) -> { 197 selectorNodeSkillTypes.put(selectorNodeSkillType.getSelectorNode(), selectorNodeSkillType); 198 }); 199 } else 200 selectorNodeSkillTypes = null; 201 } 202 203 /** Copy rawSelectorNodeTrainingClasses into the selectorNodeTrainingClasses Map, SelectorNode is the key, 204 * SelectorNodeTrainingClass is the value. 205 */ 206 private void cacheSelectorNodeTrainingClasses() { 207 List<SelectorNodeTrainingClass> rawSelectorNodeTrainingClasses = selectorControl.getSelectorNodeTrainingClassesBySelector(selector); 208 int size = rawSelectorNodeTrainingClasses.size(); 209 210 if(size > 0) { 211 selectorNodeTrainingClasses = new HashMap<>(size); 212 213 rawSelectorNodeTrainingClasses.forEach((selectorNodeTrainingClass) -> { 214 selectorNodeTrainingClasses.put(selectorNodeTrainingClass.getSelectorNode(), selectorNodeTrainingClass); 215 }); 216 } else 217 selectorNodeTrainingClasses = null; 218 } 219 220 /** Copy rawSelectorNodeGeoCodes into the selectorNodeGeoCodes Map, SelectorNode is the key, 221 * SelectorNodeGeoCode is the value. 222 */ 223 private void cacheSelectorNodeGeoCodes() { 224 List<SelectorNodeGeoCode> rawSelectorNodeGeoCodes = selectorControl.getSelectorNodeGeoCodesBySelector(selector); 225 int size = rawSelectorNodeGeoCodes.size(); 226 227 if(size > 0) { 228 selectorNodeGeoCodes = new HashMap<>(size); 229 230 rawSelectorNodeGeoCodes.forEach((selectorNodeGeoCode) -> { 231 selectorNodeGeoCodes.put(selectorNodeGeoCode.getSelectorNode(), selectorNodeGeoCode); 232 }); 233 } else 234 selectorNodeGeoCodes = null; 235 } 236 237 /** Copy rawSelectorNodeItemCategories into the selectorNodeItemCategories Map, SelectorNode is the key, 238 * SelectorNodeItemCategory is the value. 239 */ 240 private void cacheSelectorNodeItemCategories() { 241 List<SelectorNodeItemCategory> rawSelectorNodeItemCategories = selectorControl.getSelectorNodeItemCategoriesBySelector(selector); 242 int size = rawSelectorNodeItemCategories.size(); 243 244 if(size > 0) { 245 selectorNodeItemCategories = new HashMap<>(size); 246 247 rawSelectorNodeItemCategories.forEach((selectorNodeItemCategory) -> { 248 selectorNodeItemCategories.put(selectorNodeItemCategory.getSelectorNode(), selectorNodeItemCategory); 249 }); 250 } else 251 selectorNodeItemCategories = null; 252 } 253 254 /** Copy rawSelectorNodeItemAccountingCategories into the selectorNodeItemAccountingCategories Map, SelectorNode is the key, 255 * SelectorNodeItemAccountingCategory is the value. 256 */ 257 private void cacheSelectorNodeItemAccountingCategories() { 258 List<SelectorNodeItemAccountingCategory> rawSelectorNodeItemAccountingCategories = selectorControl.getSelectorNodeItemAccountingCategoriesBySelector(selector); 259 int size = rawSelectorNodeItemAccountingCategories.size(); 260 261 if(size > 0) { 262 selectorNodeItemAccountingCategories = new HashMap<>(size); 263 264 rawSelectorNodeItemAccountingCategories.forEach((selectorNodeItemAccountingCategory) -> { 265 selectorNodeItemAccountingCategories.put(selectorNodeItemAccountingCategory.getSelectorNode(), selectorNodeItemAccountingCategory); 266 }); 267 } else 268 selectorNodeItemAccountingCategories = null; 269 } 270 271 /** Copy rawSelectorNodeItemPurchasingCategories into the selectorNodeItemPurchasingCategories Map, SelectorNode is the key, 272 * SelectorNodeItemPurchasingCategory is the value. 273 */ 274 private void cacheSelectorNodeItemPurchasingCategories() { 275 List<SelectorNodeItemPurchasingCategory> rawSelectorNodeItemPurchasingCategories = selectorControl.getSelectorNodeItemPurchasingCategoriesBySelector(selector); 276 int size = rawSelectorNodeItemPurchasingCategories.size(); 277 278 if(size > 0) { 279 selectorNodeItemPurchasingCategories = new HashMap<>(size); 280 281 rawSelectorNodeItemPurchasingCategories.forEach((selectorNodeItemPurchasingCategory) -> { 282 selectorNodeItemPurchasingCategories.put(selectorNodeItemPurchasingCategory.getSelectorNode(), selectorNodeItemPurchasingCategory); 283 }); 284 } else 285 selectorNodeItemPurchasingCategories = null; 286 } 287 288 public Selector getSelector() { 289 return selector; 290 } 291 292 public SelectorNodeDetail getRootSelectorNodeDetail() { 293 return rootSelectorNodeDetail; 294 } 295 296 public SelectorNodeDetail getSelectorNodeDetailFromSelectorNode(SelectorNode selectorNode) { 297 return selectorNodes.get(selectorNode); 298 } 299 300 public SelectorNodeBoolean getSelectorNodeBooleanFromSelectorNode(SelectorNode selectorNode) { 301 return selectorNodeBooleans.get(selectorNode); 302 } 303 304 public SelectorNodeBoolean getSelectorNodeBooleanFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 305 return selectorNodeBooleans.get(selectorNodeDetail.getSelectorNode()); 306 } 307 308 public SelectorNodeEntityListItem getSelectorNodeEntityListItemFromSelectorNode(SelectorNode selectorNode) { 309 return selectorNodeEntityListItems.get(selectorNode); 310 } 311 312 public SelectorNodeEntityListItem getSelectorNodeEntityListItemFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 313 return selectorNodeEntityListItems.get(selectorNodeDetail.getSelectorNode()); 314 } 315 316 public SelectorNodeWorkflowStep getSelectorNodeWorkflowStepFromSelectorNode(SelectorNode selectorNode) { 317 return selectorNodeWorkflowSteps.get(selectorNode); 318 } 319 320 public SelectorNodeWorkflowStep getSelectorNodeWorkflowStepFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 321 return selectorNodeWorkflowSteps.get(selectorNodeDetail.getSelectorNode()); 322 } 323 324 public SelectorNodeResponsibilityType getSelectorNodeResponsibilityTypeFromSelectorNode(SelectorNode selectorNode) { 325 return selectorNodeResponsibilityTypes.get(selectorNode); 326 } 327 328 public SelectorNodeResponsibilityType getSelectorNodeResponsibilityTypeFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 329 return selectorNodeResponsibilityTypes.get(selectorNodeDetail.getSelectorNode()); 330 } 331 332 public SelectorNodeSkillType getSelectorNodeSkillTypeFromSelectorNode(SelectorNode selectorNode) { 333 return selectorNodeSkillTypes.get(selectorNode); 334 } 335 336 public SelectorNodeSkillType getSelectorNodeSkillTypeFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 337 return selectorNodeSkillTypes.get(selectorNodeDetail.getSelectorNode()); 338 } 339 340 public SelectorNodeTrainingClass getSelectorNodeTrainingClassFromSelectorNode(SelectorNode selectorNode) { 341 return selectorNodeTrainingClasses.get(selectorNode); 342 } 343 344 public SelectorNodeTrainingClass getSelectorNodeTrainingClassFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 345 return selectorNodeTrainingClasses.get(selectorNodeDetail.getSelectorNode()); 346 } 347 348 public SelectorNodeGeoCode getSelectorNodeGeoCodeFromSelectorNode(SelectorNode selectorNode) { 349 return selectorNodeGeoCodes.get(selectorNode); 350 } 351 352 public SelectorNodeGeoCode getSelectorNodeGeoCodeFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 353 return selectorNodeGeoCodes.get(selectorNodeDetail.getSelectorNode()); 354 } 355 356 public SelectorNodeItemCategory getSelectorNodeItemCategoryFromSelectorNode(SelectorNode selectorNode) { 357 return selectorNodeItemCategories.get(selectorNode); 358 } 359 360 public SelectorNodeItemCategory getSelectorNodeItemCategoryFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 361 return selectorNodeItemCategories.get(selectorNodeDetail.getSelectorNode()); 362 } 363 364 public SelectorNodeItemAccountingCategory getSelectorNodeItemAccountingCategoryFromSelectorNode(SelectorNode selectorNode) { 365 return selectorNodeItemAccountingCategories.get(selectorNode); 366 } 367 368 public SelectorNodeItemAccountingCategory getSelectorNodeItemAccountingCategoryFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 369 return selectorNodeItemAccountingCategories.get(selectorNodeDetail.getSelectorNode()); 370 } 371 372 public SelectorNodeItemPurchasingCategory getSelectorNodeItemPurchasingCategoryFromSelectorNode(SelectorNode selectorNode) { 373 return selectorNodeItemPurchasingCategories.get(selectorNode); 374 } 375 376 public SelectorNodeItemPurchasingCategory getSelectorNodeItemPurchasingCategoryFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 377 return selectorNodeItemPurchasingCategories.get(selectorNodeDetail.getSelectorNode()); 378 } 379 380}