Skip to content

Commit

Permalink
MID-9400: change handling of unsupported script in query search field
Browse files Browse the repository at this point in the history
  • Loading branch information
skublik committed Mar 20, 2024
1 parent c690945 commit c38fae6
Show file tree
Hide file tree
Showing 14 changed files with 46 additions and 79 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
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.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.repo.common.expression.ExpressionUtil;
import com.evolveum.midpoint.schema.*;
Expand Down Expand Up @@ -340,14 +341,6 @@ 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 @@ -367,14 +360,6 @@ 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 @@ -468,21 +453,6 @@ 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 @@ -521,34 +491,19 @@ 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) {
public static void checkExpressionInFilter(ObjectFilter filter) throws ExpressionEvaluationException {
if (filter == null) {
return;
}
if (ExpressionUtil.hasExpressionsAndHasNoValue(query.getFilter())) {
if (ExpressionUtil.hasExpressionsAndHasNoValue(filter)) {
throw new ExpressionEvaluationException(
new SingleLocalizableMessage(
"WebModelServiceUtils.message.error.unsupportedExpression",
new Object[]{},
"Filter contains unsupported expression. Filter: " + query.getFilter()));
"Filter contains unsupported expression. Filter: " + filter));
}
}

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,7 @@ protected Iterator<? extends PrismContainerValueWrapper<C>> doRepositoryIteratio
LOGGER.trace("Query {} with {}", getType().getSimpleName(), query.debugDump());
}

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

if (LOGGER.isTraceEnabled()) {
Expand Down Expand Up @@ -123,7 +123,7 @@ protected int internalSize() {
int count = 0;
OperationResult result = new OperationResult(OPERATION_COUNT_CONTAINERS);
try {
count = WebModelServiceUtils.countContainersByQueryFromSearchPanel(getType(), getQuery(), options, getPageBase());
count = WebModelServiceUtils.countContainers(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 @@ -111,8 +111,7 @@ public Iterator<W> internalIterator(long first, long count) {
LOGGER.trace("Query {} with {}", getType().getSimpleName(), query.debugDump());
}

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

if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Query {} resulted in {} objects", getType().getSimpleName(), list.size());
Expand Down Expand Up @@ -170,7 +169,7 @@ protected int internalSize() {
OperationResult result = new OperationResult(OPERATION_COUNT_OBJECTS);
try {
Task task = getPageBase().createSimpleTask(OPERATION_COUNT_OBJECTS);
count = WebModelServiceUtils.countObjectsByQueryFromSearchPanel(getType(), getQuery(), getOptionsToUse(), task, result, getModelService());
count = getModelService().countObjects(getType(), getQuery(), getOptionsToUse(), task, result);
} 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 = WebModelServiceUtils.countObjectsByQueryFromSearchPanel(OrgType.class, query, null, task, result, getModelService());
orgs = getModelService().countObjects(OrgType.class, query, null, task, result);

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

List<PrismObject<OrgType>> orgs = WebModelServiceUtils.searchObjectsByQueryFromSearchPanel(
OrgType.class, query, null, task, result, getModelService());
List<PrismObject<OrgType>> orgs = getModelService().searchObjects(
OrgType.class, query, null, task, result);
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 @@ -71,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 = WebModelServiceUtils.searchObjectsByQueryFromSearchPanel(
type, query, options, getPageBase().createSimpleTask(OPERATION_SEARCH_OBJECTS), result, getModelService());
List<? extends PrismObject<? extends ObjectType>> list = getModelService().searchObjects(
type, query, options, getPageBase().createSimpleTask(OPERATION_SEARCH_OBJECTS), result);
for (PrismObject<? extends ObjectType> object : list) {
getAvailableData().add(createItem(object, result));
}
Expand Down Expand Up @@ -171,7 +171,7 @@ protected int internalSize() {
try {
Class<O> type = SearchBoxModeType.OID.equals(getSearchModel().getObject().getSearchMode()) ? (Class<O>) ObjectType.class : getType();
var task = getPageBase().createSimpleTask(OPERATION_COUNT_OBJECTS);
count = WebModelServiceUtils.countObjectsByQueryFromSearchPanel(type, getQuery(), getOptions(), task, result, getModelService());
count = getModelService().countObjects(type, getQuery(), getOptions(), task, result);
} 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 @@ -49,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 WebModelServiceUtils.searchContainersByQueryFromSearchPanel(type, query, options, task, result, getModelService());
return getModelService().searchContainers(type, query, options, task, result);
}

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

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,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 WebModelServiceUtils.countObjectsByQueryFromSearchPanel(
type, getQuery(), currentOptions, task, result, getModelService());
return getModelService().countObjects(
type, getQuery(), currentOptions, task, result);
}

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,15 @@
import javax.xml.namespace.QName;

import com.evolveum.midpoint.gui.api.page.PageAdminLTE;
import com.evolveum.midpoint.gui.api.util.LocalizationUtil;
import com.evolveum.midpoint.prism.impl.query.OrFilterImpl;
import com.evolveum.midpoint.prism.query.AndFilter;
import com.evolveum.midpoint.schema.util.ObjectQueryUtil;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.util.exception.CommonException;
import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType;

import groovyjarjarpicocli.CommandLine;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

Expand Down Expand Up @@ -207,9 +210,13 @@ private String createErrorMessage(Exception ex) {
StringBuilder sb = new StringBuilder();

Throwable t = ex;
while (t != null && t.getMessage() != null) {
sb.append(t.getMessage()).append('\n');
t = t.getCause();
if (t instanceof CommonException commonException && commonException.getUserFriendlyMessage() != null) {
sb.append(LocalizationUtil.translateMessage(commonException.getUserFriendlyMessage()));
} else {
while (t != null && t.getMessage() != null) {
sb.append(t.getMessage()).append('\n');
t = t.getCause();
}
}
if (StringUtils.isBlank(sb.toString())) {
sb.append(PageBase.createStringResourceStatic("SearchPanel.unexpectedQuery").getString());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.util.exception.ExpressionEvaluationException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.apache.commons.collections4.CollectionUtils;
Expand Down Expand Up @@ -520,7 +521,8 @@ private void applyFilterToAxiomOrAdvancedMode(List<SearchItemType> items, Search
return;
}
try {
ObjectFilter objectFilter = getPageBase().getQueryConverter().createObjectFilter(getModelObject().getTypeClass(), axiomSearchItem.getFilter());
ObjectFilter objectFilter = getPageBase().getQueryConverter().createObjectFilter(
getModelObject().getTypeClass(), axiomSearchItem.getFilter());
PrismQuerySerialization serializer = PrismContext.get().querySerializer().serialize(objectFilter);
getModelObject().setDslQuery(serializer.filterText());
} catch (SchemaException | PrismQuerySerialization.NotSupportedException e) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package com.evolveum.midpoint.gui.impl.component.search.wrapper;

import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.schema.expression.VariablesMap;
import com.evolveum.midpoint.util.exception.ExpressionEvaluationException;
import com.evolveum.midpoint.util.exception.SchemaException;

import org.apache.commons.lang3.StringUtils;
Expand All @@ -23,17 +25,21 @@ public AxiomQueryWrapper(ItemDefinition<?> containerDefinitionOverride) {
this.containerDefinitionOverride = containerDefinitionOverride;
}

public <T> ObjectQuery createQuery(Class<T> typeClass, PageBase pageBase, VariablesMap variablesMap) throws SchemaException {
public <T> ObjectQuery createQuery(Class<T> typeClass, PageBase pageBase, VariablesMap variablesMap) throws SchemaException, ExpressionEvaluationException {
if (StringUtils.isEmpty(dslQuery)) {
return null;
}
PrismContext ctx = PrismContext.get();
var parser = ctx.createQueryParser(ctx.getSchemaRegistry().staticNamespaceContext().allPrefixes());

if (containerDefinitionOverride == null) {
ObjectFilter filter = parser.parseFilter(typeClass, dslQuery);
WebModelServiceUtils.checkExpressionInFilter(filter);
return ctx.queryFactory().createQuery(filter);
}

ObjectFilter filter = parser.parseFilter(containerDefinitionOverride, dslQuery);
WebModelServiceUtils.checkExpressionInFilter(filter);
return ctx.queryFactory().createQuery(filter);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,14 @@
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.schema.expression.VariablesMap;
import com.evolveum.midpoint.util.exception.ExpressionEvaluationException;
import com.evolveum.midpoint.util.exception.SchemaException;

import java.io.Serializable;

public interface QueryWrapper extends Serializable {

<T> ObjectQuery createQuery(Class<T> typeClass, PageBase pageBase, VariablesMap variables) throws SchemaException;
<T> ObjectQuery createQuery(Class<T> typeClass, PageBase pageBase, VariablesMap variables) throws SchemaException, ExpressionEvaluationException;

String getAdvancedError();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -376,8 +376,7 @@ private Integer countFor(ObjectFilter situationFilter) {
try {
ObjectQuery query = PrismContext.get().queryFactory().createQuery(
PrismContext.get().queryFactory().createAnd(filter, situationFilter));
return WebModelServiceUtils.countObjectsByQueryFromSearchPanel(
ShadowType.class, query, options, task, result, getPageBase().getModelService());
return getPageBase().getModelService().countObjects(ShadowType.class, query, options, task, result);
} catch (CommonException | RuntimeException ex) {
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't count shadows", ex);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,16 +128,15 @@ private List<AccessCertificationCaseType> searchCases(String campaignOid, Object
InOidFilter inOidFilter = prismContext.queryFactory().createOwnerHasOidIn(campaignOid);
ObjectQuery query = createFinalQuery(inOidFilter, prismContext);
query.setPaging(paging);
return WebModelServiceUtils.searchContainersByQueryFromSearchPanel(
AccessCertificationCaseType.class, query, options, task, result, getModelService());
return getModelService().searchContainers(AccessCertificationCaseType.class, query, options, task, result);
}

private int countCases(String campaignOid, Collection<SelectorOptions<GetOperationOptions>> options,
PrismContext prismContext, Task task, OperationResult result)
throws CommonException {
InOidFilter inOidFilter = prismContext.queryFactory().createOwnerHasOidIn(campaignOid);
ObjectQuery query = createFinalQuery(inOidFilter, prismContext);
return WebModelServiceUtils.countContainersByQueryFromSearchPanel(AccessCertificationCaseType.class, query, options, task, result, getModelService());
return getModelService().countContainers(AccessCertificationCaseType.class, query, options, task, result);
}

@NotNull
Expand Down

0 comments on commit c38fae6

Please sign in to comment.