* @return never null
*/
public EntitySelector buildEntitySelector(EnvironmentMode environmentMode, SolutionDescriptor solutionDescriptor,
SelectionCacheType minimumCacheType, SelectionOrder inheritedSelectionOrder) {
PlanningEntityDescriptor entityDescriptor = fetchEntityDescriptor(solutionDescriptor);
SelectionCacheType resolvedCacheType = SelectionCacheType.resolve(cacheType, minimumCacheType);
minimumCacheType = SelectionCacheType.max(minimumCacheType, resolvedCacheType);
SelectionOrder resolvedSelectionOrder = SelectionOrder.resolve(selectionOrder, inheritedSelectionOrder);
// baseEntitySelector and lower should be SelectionOrder.ORIGINAL if they are going to get cached completely
EntitySelector entitySelector = buildBaseEntitySelector(environmentMode, entityDescriptor,
minimumCacheType, resolvedCacheType.isCached() ? SelectionOrder.ORIGINAL : resolvedSelectionOrder);
boolean alreadyCached = false;
if (!CollectionUtils.isEmpty(entityFilterClassList)
|| entityDescriptor.hasMovableEntitySelectionFilter()) {
List<SelectionFilter> entityFilterList = new ArrayList<SelectionFilter>(
entityFilterClassList == null ? 1 : entityFilterClassList.size());
if (entityFilterClassList != null) {
for (Class<? extends SelectionFilter> entityFilterClass : entityFilterClassList) {
entityFilterList.add(ConfigUtils.newInstance(this, "entityFilterClass", entityFilterClass));
}
}
if (entityDescriptor.hasMovableEntitySelectionFilter()) {
entityFilterList.add(entityDescriptor.getMovableEntitySelectionFilter());
}
entitySelector = new FilteringEntitySelector(entitySelector, entityFilterList);
alreadyCached = false;
}
// TODO entitySorterClass
if (entityProbabilityWeightFactoryClass != null) {
if (resolvedSelectionOrder != SelectionOrder.RANDOM) {
throw new IllegalArgumentException("The entitySelectorConfig (" + this
+ ") with entityProbabilityWeightFactoryClass ("
+ entityProbabilityWeightFactoryClass + ") has a resolvedSelectionOrder ("
+ resolvedSelectionOrder + ") that is not " + SelectionOrder.RANDOM + ".");
}
SelectionProbabilityWeightFactory entityProbabilityWeightFactory = ConfigUtils.newInstance(this,
"entityProbabilityWeightFactoryClass", entityProbabilityWeightFactoryClass);
entitySelector = new ProbabilityEntitySelector(entitySelector,
resolvedCacheType, entityProbabilityWeightFactory);
alreadyCached = true;
}
if (resolvedSelectionOrder == SelectionOrder.SHUFFLED) {
entitySelector = new ShufflingEntitySelector(entitySelector, resolvedCacheType);
alreadyCached = true;
}
if (resolvedCacheType.isCached() && !alreadyCached) {
// TODO this might be pretty pointless, because FromSolutionEntitySelector caches
entitySelector = new CachingEntitySelector(entitySelector, resolvedCacheType,
resolvedSelectionOrder == SelectionOrder.RANDOM);
}
return entitySelector;