Skip to content

Commit

Permalink
MID-9400: adding better error message when use unsupported expression…
Browse files Browse the repository at this point in the history
… in axiom query of search panel
  • Loading branch information
skublik committed Mar 5, 2024
1 parent 3825017 commit e7905b2
Show file tree
Hide file tree
Showing 12 changed files with 119 additions and 37 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,14 @@
import com.evolveum.midpoint.gui.impl.page.login.module.PageLogin;
import com.evolveum.midpoint.model.api.ModelExecuteOptions;
import com.evolveum.midpoint.model.api.ModelInteractionService;
import com.evolveum.midpoint.model.api.ModelService;
import com.evolveum.midpoint.model.api.authentication.CompiledGuiProfile;
import com.evolveum.midpoint.model.api.authentication.GuiProfiledPrincipal;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.repo.common.expression.ExpressionUtil;
import com.evolveum.midpoint.schema.*;
import com.evolveum.midpoint.schema.constants.ObjectTypes;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
Expand All @@ -29,6 +31,7 @@
import com.evolveum.midpoint.task.api.TaskManager;
import com.evolveum.midpoint.util.MiscUtil;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.util.SingleLocalizableMessage;
import com.evolveum.midpoint.util.exception.*;
import com.evolveum.midpoint.util.logging.LoggingUtils;
import com.evolveum.midpoint.util.logging.Trace;
Expand Down Expand Up @@ -337,6 +340,14 @@ public static <T extends ObjectType> List<PrismObject<T>> searchObjects(
return objects;
}

public static <T extends ObjectType> SearchResultList<PrismObject<T>> searchObjectsByQueryFromSearchPanel(
Class<T> type, ObjectQuery query, Collection<SelectorOptions<GetOperationOptions>> currentOptions,
Task task, OperationResult result, ModelService modelService) throws CommonException{
checkExpressionInFilter(query);

return modelService.searchObjects(type, query, currentOptions, task, result);
}

public static <T extends ObjectType> int countObjects(Class<T> type, ObjectQuery query, PageBase page) {
LOGGER.debug("Count object: type => {}, query => {}", type, query);
Task task = page.createSimpleTask(OPERATION_COUNT_OBJECT);
Expand All @@ -347,8 +358,7 @@ public static <T extends ObjectType> int countObjects(Class<T> type, ObjectQuery
.distinct(true)
.build();
count = page.getModelService().countObjects(type, query, options, task, parentResult);
} catch (SchemaException | ObjectNotFoundException | SecurityViolationException
| ConfigurationException | CommunicationException | ExpressionEvaluationException ex) {
} catch (CommonException ex) {
parentResult.recordFatalError(page.createStringResource("WebModelUtils.couldntCountObjects").getString(), ex);
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't count objects", ex);
}
Expand All @@ -357,6 +367,14 @@ public static <T extends ObjectType> int countObjects(Class<T> type, ObjectQuery
return count;
}

public static <T extends ObjectType> int countObjectsByQueryFromSearchPanel(
Class<T> type, ObjectQuery query, Collection<SelectorOptions<GetOperationOptions>> currentOptions,
Task task, OperationResult result, ModelService modelService) throws CommonException{
checkExpressionInFilter(query);

return modelService.countObjects(type, query, currentOptions, task, result);
}

public static <T extends ObjectType> void deleteObject(Class<T> type, String oid, OperationResult result,
PageBase page) {
deleteObject(type, oid, null, result, page, null);
Expand Down Expand Up @@ -450,6 +468,21 @@ public static void save(Collection<ObjectDelta<? extends ObjectType>> deltas, Mo
LOGGER.debug("Saved with result {}", subResult);
}

public static <C extends Containerable> List<C> searchContainersByQueryFromSearchPanel(Class<C> type, ObjectQuery query,
Collection<SelectorOptions<GetOperationOptions>> options, OperationResult result, PageBase page) throws ExpressionEvaluationException {
checkExpressionInFilter(query);

return searchContainers(type, query, options, result, page);
}

public static <C extends Containerable> List<C> searchContainersByQueryFromSearchPanel(Class<C> type, ObjectQuery query,
Collection<SelectorOptions<GetOperationOptions>> options, Task task, OperationResult result, ModelService modelService)
throws CommonException {
checkExpressionInFilter(query);

return modelService.searchContainers(type, query, options, task, result);
}

public static <C extends Containerable> List<C> searchContainers(Class<C> type, ObjectQuery query,
Collection<SelectorOptions<GetOperationOptions>> options, OperationResult result, PageBase page) {
LOGGER.debug("Searching {}, options {}", type.getSimpleName(), options);
Expand Down Expand Up @@ -488,6 +521,34 @@ public static <C extends Containerable> List<C> searchContainers(Class<C> type,
return containers;
}

public static <C extends Containerable> int countContainersByQueryFromSearchPanel(Class<C> type, ObjectQuery query,
Collection<SelectorOptions<GetOperationOptions>> options, Task task, OperationResult result, ModelService modelService)
throws CommonException{
checkExpressionInFilter(query);

return modelService.countContainers(type, query, options, task, result);
}

private static void checkExpressionInFilter(ObjectQuery query) throws ExpressionEvaluationException {
if (query == null) {
return;
}
if (ExpressionUtil.hasExpressionsAndHasNoValue(query.getFilter())) {
throw new ExpressionEvaluationException(
new SingleLocalizableMessage(
"WebModelServiceUtils.message.error.unsupportedExpression",
new Object[]{},
"Filter contains unsupported expression. Filter: " + query.getFilter()));
}
}

public static <C extends Containerable> int countContainersByQueryFromSearchPanel(Class<C> type, ObjectQuery query,
Collection<SelectorOptions<GetOperationOptions>> options, PageBase page) throws CommonException{
checkExpressionInFilter(query);

return countContainers(type, query, options, page);
}

public static <C extends Containerable> int countContainers(Class<C> type, ObjectQuery query,
Collection<SelectorOptions<GetOperationOptions>> options, PageBase page) {
LOGGER.debug("Count containers: type => {}, query => {}", type, query);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,8 @@ protected Iterator<? extends PrismContainerValueWrapper<C>> doRepositoryIteratio
LOGGER.trace("Query {} with {}", getType().getSimpleName(), query.debugDump());
}

List<C> list = WebModelServiceUtils.searchContainers(getType(), query, options, result, getPageBase());
List<C> list = WebModelServiceUtils.searchContainersByQueryFromSearchPanel(
getType(), query, options, result, getPageBase());

if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Query {} resulted in {} containers", getType().getSimpleName(), list.size());
Expand Down Expand Up @@ -122,7 +123,7 @@ protected int internalSize() {
int count = 0;
OperationResult result = new OperationResult(OPERATION_COUNT_CONTAINERS);
try {
count = WebModelServiceUtils.countContainers(getType(), getQuery(), options, getPageBase());
count = WebModelServiceUtils.countContainersByQueryFromSearchPanel(getType(), getQuery(), options, getPageBase());
} catch (Exception ex) {
result.recordFatalError(getPageBase().createStringResource("ContainerListDataProvider.message.listContainers.fatalError").getString(), ex);
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't count containers", ex);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,9 @@
import java.io.Serializable;
import java.util.*;

import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.gui.impl.component.search.Search;

import com.evolveum.midpoint.util.exception.CommonException;
import com.evolveum.midpoint.util.exception.SystemException;
import com.evolveum.midpoint.web.component.data.TypedCacheKey;
import com.evolveum.midpoint.web.component.util.SelectableBean;

Expand Down Expand Up @@ -112,7 +111,8 @@ public Iterator<W> internalIterator(long first, long count) {
LOGGER.trace("Query {} with {}", getType().getSimpleName(), query.debugDump());
}

List<PrismObject<O>> list = getModelService().searchObjects(getType(), query, getOptionsToUse(), task, result);
List<PrismObject<O>> list = WebModelServiceUtils.searchObjectsByQueryFromSearchPanel
(getType(), query, getOptionsToUse(), task, result, getModelService());

if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Query {} resulted in {} objects", getType().getSimpleName(), list.size());
Expand Down Expand Up @@ -170,7 +170,7 @@ protected int internalSize() {
OperationResult result = new OperationResult(OPERATION_COUNT_OBJECTS);
try {
Task task = getPageBase().createSimpleTask(OPERATION_COUNT_OBJECTS);
count = getModelService().countObjects(getType(), getQuery(), getOptionsToUse(), task, result);
count = WebModelServiceUtils.countObjectsByQueryFromSearchPanel(getType(), getQuery(), getOptionsToUse(), task, result, getModelService());
} catch (Exception ex) {
setupUserFriendlyMessage(result, ex);
result.recordFatalError(getPageBase().createStringResource("ObjectDataProvider.message.countObjects.fatalError").getString(), ex);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ public long size(TreeSelectableBean<OrgType> node) {
.isDirectChildOf(nodeOid)
.build();

orgs = getModelService().countObjects(OrgType.class, query, null, task, result);
orgs = WebModelServiceUtils.countObjectsByQueryFromSearchPanel(OrgType.class, query, null, task, result, getModelService());

LOGGER.debug("Found {} sub-orgs.", orgs);
} catch (CommonException|RuntimeException ex) {
Expand Down Expand Up @@ -159,7 +159,8 @@ public Iterator<? extends TreeSelectableBean<OrgType>> getChildren(TreeSelectabl
ObjectPaging paging = createPaging(node);
query.setPaging(paging);

List<PrismObject<OrgType>> orgs = getModelService().searchObjects(OrgType.class, query, null, task, result);
List<PrismObject<OrgType>> orgs = WebModelServiceUtils.searchObjectsByQueryFromSearchPanel(
OrgType.class, query, null, task, result, getModelService());
LOGGER.debug("Found {} sub-orgs.", orgs.size());
children = new ArrayList<>();
for (PrismObject<OrgType> org : orgs) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import java.io.Serializable;
import java.util.*;

import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.gui.impl.component.search.Search;

import com.evolveum.midpoint.web.component.data.TypedCacheKey;
Expand Down Expand Up @@ -70,8 +71,8 @@ public Iterator<DebugObjectItem> internalIterator(long first, long count) {

Collection<SelectorOptions<GetOperationOptions>> options = getOptions();
Class<O> type = SearchBoxModeType.OID.equals(getSearchModel().getObject().getSearchMode()) ? (Class<O>) ObjectType.class : getType();
List<? extends PrismObject<? extends ObjectType>> list = getModelService().searchObjects(type, query, options,
getPageBase().createSimpleTask(OPERATION_SEARCH_OBJECTS), result);
List<? extends PrismObject<? extends ObjectType>> list = WebModelServiceUtils.searchObjectsByQueryFromSearchPanel(
type, query, options, getPageBase().createSimpleTask(OPERATION_SEARCH_OBJECTS), result, getModelService());
for (PrismObject<? extends ObjectType> object : list) {
getAvailableData().add(createItem(object, result));
}
Expand Down Expand Up @@ -169,8 +170,8 @@ protected int internalSize() {
OperationResult result = new OperationResult(OPERATION_COUNT_OBJECTS);
try {
Class<O> type = SearchBoxModeType.OID.equals(getSearchModel().getObject().getSearchMode()) ? (Class<O>) ObjectType.class : getType();
count = getModelService().countObjects(type, getQuery(), getOptions(),
getPageBase().createSimpleTask(OPERATION_COUNT_OBJECTS), result);
var task = getPageBase().createSimpleTask(OPERATION_COUNT_OBJECTS);
count = WebModelServiceUtils.countObjectsByQueryFromSearchPanel(type, getQuery(), getOptions(), task, result, getModelService());
} catch (Exception ex) {
result.recordFatalError(getPageBase().createStringResource("ObjectDataProvider.message.countObjects.fatalError").getString(), ex);
} finally {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
import java.util.Map;
import java.util.Set;

import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;

import org.apache.wicket.Component;
import org.apache.wicket.model.IModel;
import org.jetbrains.annotations.NotNull;
Expand Down Expand Up @@ -46,13 +49,13 @@ protected boolean checkOrderingSettings() {

@Override
protected List<C> searchObjects(Class<C> type, ObjectQuery query, Collection<SelectorOptions<GetOperationOptions>> options, Task task, OperationResult result) throws CommonException {
return getModelService().searchContainers(type, query, options, task, result);
return WebModelServiceUtils.searchContainersByQueryFromSearchPanel(type, query, options, task, result, getModelService());
}

protected Integer countObjects(Class<C> type, ObjectQuery query,
Collection<SelectorOptions<GetOperationOptions>> currentOptions, Task task, OperationResult result)
throws CommonException {
return getModelService().countContainers(type, getQuery(), currentOptions, task, result);
return WebModelServiceUtils.countContainersByQueryFromSearchPanel(type, getQuery(), currentOptions, task, result, getModelService());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import java.util.Set;
import java.util.function.Consumer;

import com.evolveum.midpoint.gui.api.util.WebComponentUtil;

import org.apache.wicket.Component;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
Expand Down Expand Up @@ -87,7 +89,8 @@ protected boolean match(O selectedValue, O foundValue) {
protected Integer countObjects(Class<O> type, ObjectQuery query,
Collection<SelectorOptions<GetOperationOptions>> currentOptions,
Task task, OperationResult result) throws CommonException {
return getModelService().countObjects(type, getQuery(), currentOptions, task, result);
return WebModelServiceUtils.countObjectsByQueryFromSearchPanel(
type, getQuery(), currentOptions, task, result, getModelService());
}

protected boolean isMemberPanel() {
Expand All @@ -103,7 +106,7 @@ protected List<O> searchObjects(Class<O> type, ObjectQuery query, Collection<Sel
if (taskConsumer != null) {
taskConsumer.accept(task);
}
return getModelService().searchObjects(type, query, options, task, result)
return WebModelServiceUtils.searchObjectsByQueryFromSearchPanel(type, query, options, task, result, getModelService())
.map(prismObject -> prismObject.asObjectable());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,7 @@
import java.util.List;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.gui.api.model.LoadableModel;

import com.evolveum.midpoint.web.page.admin.resources.content.dto.ResourceContentSearchDto;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.web.session.ResourceContentStorage;

import org.apache.commons.lang3.StringUtils;
Expand Down Expand Up @@ -401,7 +399,8 @@ private Integer countFor(ObjectFilter situationFilter) {
try {
ObjectQuery query = PrismContext.get().queryFactory().createQuery(
PrismContext.get().queryFactory().createAnd(filter, situationFilter));
return getPageBase().getModelService().countObjects(ShadowType.class, query, options, task, result);
return WebModelServiceUtils.countObjectsByQueryFromSearchPanel(
ShadowType.class, query, options, task, result, getPageBase().getModelService());
} catch (CommonException | RuntimeException ex) {
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't count shadows", ex);
}
Expand Down Expand Up @@ -544,7 +543,7 @@ public int getCount() {
return 0;
}

ObjectQuery query = createQueryFroTasks(isSimulationTasks);
ObjectQuery query = createQueryForTasks(isSimulationTasks);
if (archetypeOid != null) {
query.addFilter(PrismContext.get()
.queryFor(TaskType.class)
Expand Down Expand Up @@ -604,13 +603,13 @@ private void redirectToTasksListPage(@Nullable String archetypeOid, boolean isSi
}
}

ObjectQuery query = createQueryFroTasks(isSimulationTasks);
ObjectQuery query = createQueryForTasks(isSimulationTasks);

PageTasks pageTasks = new PageTasks(query, pageParameters);
getPageBase().setResponsePage(pageTasks);
}

private ObjectQuery createQueryFroTasks(boolean isSimulationTasks) {
private ObjectQuery createQueryForTasks(boolean isSimulationTasks) {
S_FilterExit filter = PrismContext.get()
.queryFor(TaskType.class)
.item(ItemPath.create(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
package com.evolveum.midpoint.web.application;

import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.ModelServiceLocator;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.gui.impl.page.admin.cases.CaseDetailsModels;
import com.evolveum.midpoint.prism.PrismContext;
Expand Down

0 comments on commit e7905b2

Please sign in to comment.