Skip to content

Commit

Permalink
Fix MID-9372 query playground
Browse files Browse the repository at this point in the history
  • Loading branch information
tchrapovic committed Jan 19, 2024
1 parent 88fb273 commit c5f3ec7
Showing 1 changed file with 54 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,6 @@
import java.util.*;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.gui.impl.util.DetailsPageUtil;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.schema.query.TypedQuery;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
Expand All @@ -40,15 +36,21 @@
import com.evolveum.midpoint.gui.impl.component.input.expression.ScriptExpressionPanel;
import com.evolveum.midpoint.gui.impl.component.search.Search;
import com.evolveum.midpoint.gui.impl.component.search.SearchBuilder;
import com.evolveum.midpoint.gui.impl.util.DetailsPageUtil;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismPropertyValue;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.PrismQuerySerialization;
import com.evolveum.midpoint.repo.common.expression.ExpressionUtil;
import com.evolveum.midpoint.schema.*;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.RepositoryQueryDiagRequest;
import com.evolveum.midpoint.schema.RepositoryQueryDiagResponse;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.expression.VariablesMap;
import com.evolveum.midpoint.schema.query.TypedQuery;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.MiscSchemaUtil;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
Expand All @@ -67,7 +69,6 @@
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.page.admin.configuration.PageRepositoryQuery;
import com.evolveum.midpoint.web.page.admin.configuration.dto.RepoQueryDto;
import com.evolveum.midpoint.web.security.MidPointAuthWebSession;
import com.evolveum.midpoint.web.session.PageStorage;
import com.evolveum.midpoint.web.session.SessionStorage;
import com.evolveum.midpoint.web.util.StringResourceChoiceRenderer;
Expand Down Expand Up @@ -98,15 +99,12 @@ public class QueryPlaygroundPanel extends BasePanel<RepoQueryDto> {
private static final String ID_INCOMPLETE_RESULTS_NOTE = "incompleteResultsNote";
private static final String ID_SCRIPT_ENABLED = "scriptEnabled";


private static final String DOT_CLASS = QueryPlaygroundPanel.class.getName() + ".";

private static final String OPERATION_CHECK_QUERY = DOT_CLASS + "checkQuery";
private static final String OPERATION_TRANSLATE_QUERY = DOT_CLASS + "translateQuery";
private static final String OPERATION_EXECUTE_QUERY = DOT_CLASS + "executeQuery";



private static final String SAMPLES_DIR = "query-samples";
private static final List<String> SAMPLES = Arrays.asList(
"UserType_AllUsers",
Expand Down Expand Up @@ -147,7 +145,8 @@ protected void onInitialize() {

boolean admin;
try {
admin = getPageBase().isAuthorized(AuthorizationConstants.AUTZ_ALL_URL, null, null, null, null);
admin = getPageBase()
.isAuthorized(AuthorizationConstants.AUTZ_ALL_URL, null, null, null, null);
} catch (SchemaException | ExpressionEvaluationException | ObjectNotFoundException | RuntimeException
| CommunicationException | ConfigurationException | SecurityViolationException e) {
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't determine admin authorization -- continuing as non-admin", e);
Expand Down Expand Up @@ -181,10 +180,12 @@ protected void onUpdate(AjaxRequestTarget target) {

CheckFormGroup distinctCheck = new CheckFormGroup(
ID_DISTINCT, new PropertyModel<>(getModel(), RepoQueryDto.F_DISTINCT),
createStringResource("PageRepositoryQuery.checkBox.distinct"), "col-xs-3", "col-xs-1");
createStringResource(
"PageRepositoryQuery.checkBox.distinct"), "col-xs-3", "col-xs-1");
mainForm.add(distinctCheck);

AceEditor editorMidPoint = new AceEditor(ID_EDITOR_MIDPOINT, new PropertyModel<>(getModel(), RepoQueryDto.F_MIDPOINT_QUERY));
AceEditor editorMidPoint = new AceEditor(ID_EDITOR_MIDPOINT, new PropertyModel<>(getModel(),
RepoQueryDto.F_MIDPOINT_QUERY));
editorMidPoint.setHeight(400);
editorMidPoint.setResizeToMaxHeight(false);
mainForm.add(editorMidPoint);
Expand All @@ -201,8 +202,8 @@ protected void onUpdate(AjaxRequestTarget ajaxRequestTarget) {
scriptCheck.setOutputMarkupId(true);
mainForm.add(scriptCheck);


ScriptExpressionPanel scriptExpressionPanel = new ScriptExpressionPanel(ID_EDITOR_MIDPOINT_SCRIPT, new PropertyModel<>(getModel(), RepoQueryDto.F_MIDPOINT_QUERY_SCRIPT));
ScriptExpressionPanel scriptExpressionPanel = new ScriptExpressionPanel(ID_EDITOR_MIDPOINT_SCRIPT,
new PropertyModel<>(getModel(), RepoQueryDto.F_MIDPOINT_QUERY_SCRIPT));
scriptExpressionPanel.setOutputMarkupId(true);
scriptExpressionPanel.setOutputMarkupPlaceholderTag(true);
scriptExpressionPanel.add(new VisibleBehaviour(() -> getModel().getObject().isScriptEnabled()));
Expand Down Expand Up @@ -234,7 +235,6 @@ protected void onUpdate(AjaxRequestTarget ajaxRequestTarget) {
midPointQueryButtonBar.setOutputMarkupId(true);
mainForm.add(midPointQueryButtonBar);


AjaxSubmitButton executeMidPoint = new AjaxSubmitButton(ID_EXECUTE_MIDPOINT,
createStringResource("PageRepositoryQuery.button.translateAndExecute")) {
@Override
Expand Down Expand Up @@ -300,11 +300,15 @@ protected void onUpdate(AjaxRequestTarget target) {
String localTypeName = StringUtils.substringBefore(sampleName, "_");
getModel().getObject().setObjectType(new QName(SchemaConstants.NS_C, localTypeName));
String xml = IOUtils.toString(is, StandardCharsets.UTF_8);
String serialization;
String serialization = "";
PrismContext prismContext = getPrismContext();
try {
QueryType parsed = prismContext.parserFor(xml).xml().parseRealValue(QueryType.class);
serialization = parsed.getFilter().getText();
SearchFilterType filter = parsed.getFilter();
if (filter != null && filter.getText() != null) {
serialization = filter.getText();
}

} catch (Throwable t) {
serialization = "Couldn't serialize sample: " + t.getMessage();
}
Expand Down Expand Up @@ -390,23 +394,28 @@ private void useInObjectListPerformed(AjaxRequestTarget target) {
if (dto.isScriptEnabled()) {
scriptQuery = dto.getMidPointQueryScript();
}
updateRequestWithMidpointQuery(request, dto.getObjectType(), dto.getMidPointQuery(), dto.isDistinct(), scriptQuery, task, result);

updateRequestWithMidpointQuery(request, dto.getObjectType(), dto.getMidPointQuery(),
dto.isDistinct(), scriptQuery, task, result);
//noinspection unchecked
Class<? extends PageBase> listPageClass = DetailsPageUtil.getObjectListPage((Class<? extends ObjectType>) request.getType());
String storageKey = listPageClass != null ? WebComponentUtil.getObjectListPageStorageKey(dto.getObjectType().getLocalPart()) : null;
String storageKey = listPageClass != null
? WebComponentUtil.getObjectListPageStorageKey(dto.getObjectType().getLocalPart())
: null;
if (storageKey == null) {
// shouldn't occur because of button visibility
error("No page to redirect for " + dto.getObjectType());
target.add(getFeedbackPanel());
return;
}

SessionStorage sessionStorage = ((MidPointAuthWebSession) getSession()).getSessionStorage();
SessionStorage sessionStorage = getSession().getSessionStorage();
PageStorage storage = sessionStorage.getPageStorageMap().get(storageKey);
if (storage == null) {
storage = sessionStorage.initPageStorage(storageKey);
}
Search search = storage.getSearch() != null ? storage.getSearch() : new SearchBuilder(request.getType()).modelServiceLocator(getPageBase()).build();
Search<?> search = storage.getSearch() != null ? storage.getSearch()
: new SearchBuilder<>(request.getType()).modelServiceLocator(getPageBase()).build();
search.addAllowedModelType(SearchBoxModeType.AXIOM_QUERY);
search.setSearchMode(SearchBoxModeType.AXIOM_QUERY);
// Use query from model object, call of updateRequestWithMidpointQuery may updated it with new Query Language text.
Expand Down Expand Up @@ -435,35 +444,32 @@ private void queryPerformed(QueryPlaygroundPanel.Action action, AjaxRequestTarge

RepoQueryDto dto = getModelObject();
try {
boolean queryPresent;
RepositoryQueryDiagRequest request = new RepositoryQueryDiagRequest();

switch (action) {
case TRANSLATE_ONLY:
request.setTranslateOnly(true);
// Falls through to the next section, we want this.
case EXECUTE_MIDPOINT:
queryPresent = StringUtils.isNotBlank(dto.getMidPointQuery()) || !dto.getMidPointQueryScript().getExpressionEvaluator().isEmpty();
if (queryPresent) {
ExpressionType scriptQuery = null;
if (dto.isScriptEnabled()) {
scriptQuery = dto.getMidPointQueryScript();
}
updateRequestWithMidpointQuery(request, dto.getObjectType(), dto.getMidPointQuery(), dto.isDistinct(), scriptQuery, task, result);
ExpressionType scriptQuery = null;
if (dto.isScriptEnabled()) {
scriptQuery = dto.getMidPointQueryScript();
}
updateRequestWithMidpointQuery(request, dto.getObjectType(), dto.getMidPointQuery(),
dto.isDistinct(), scriptQuery, task, result);
break;
default:
throw new IllegalArgumentException("Invalid action: " + action);
}

if (!queryPresent) {
RepositoryQueryDiagResponse response;
List<?> queryResult;

if (ObjectReferenceType.class.isAssignableFrom(request.getType()) && request.getQuery() == null) {
warnNoQuery(target);
return;
}

RepositoryQueryDiagResponse response;
List<?> queryResult;

if (isAdmin) {
response = getPageBase().getModelDiagnosticService().executeRepositoryQuery(request, task, result);
queryResult = response.getQueryResult();
Expand All @@ -483,7 +489,8 @@ private void queryPerformed(QueryPlaygroundPanel.Action action, AjaxRequestTarge

dto.setHibernateQuery(String.valueOf(response.getImplementationLevelQuery()));
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, RepositoryQueryDiagResponse.ParameterValue> entry : response.getImplementationLevelQueryParameters().entrySet()) {
for (Map.Entry<String, RepositoryQueryDiagResponse.ParameterValue> entry
: response.getImplementationLevelQueryParameters().entrySet()) {
sb.append(entry.getKey()).append(" = ").append(entry.getValue().displayValue).append("\n");
}
dto.setHibernateParameters(sb.toString());
Expand All @@ -509,14 +516,16 @@ private void queryPerformed(QueryPlaygroundPanel.Action action, AjaxRequestTarge
target.add(this);
}

private List<?> performModelSearch(RepositoryQueryDiagRequest request, Task task, OperationResult result) throws SchemaException, ExpressionEvaluationException, SecurityViolationException, CommunicationException, ConfigurationException, ObjectNotFoundException {
private List<?> performModelSearch(RepositoryQueryDiagRequest request, Task task, OperationResult result)
throws SchemaException, ExpressionEvaluationException, SecurityViolationException,
CommunicationException, ConfigurationException, ObjectNotFoundException {
if (ObjectType.class.isAssignableFrom(request.getType())) {
return getPageBase().getModelService().searchObjects((Class<? extends ObjectType>) request.getType(), request.getQuery(),
createRawCollection(), task, result);
return getPageBase().getModelService().searchObjects(
(Class<? extends ObjectType>) request.getType(), request.getQuery(), createRawCollection(), task, result);
}
if (Containerable.class.isAssignableFrom(request.getType())) {
return getPageBase().getModelService().searchContainers((Class<? extends Containerable>) request.getType(), request.getQuery(),
createRawCollection(), task, result);
return getPageBase().getModelService().searchContainers(
(Class<? extends Containerable>) request.getType(), request.getQuery(), createRawCollection(), task, result);
}
if (ObjectReferenceType.class.isAssignableFrom(request.getType())) {
return getPageBase().getModelService().searchReferences(request.getQuery(), createRawCollection(), task, result);
Expand All @@ -535,7 +544,8 @@ private void updateRequestWithMidpointQuery(
boolean distinct,
ExpressionType midPointQueryScript,
Task task, OperationResult result)
throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException, PrismQuerySerialization.NotSupportedException {
throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException,
ConfigurationException, SecurityViolationException, PrismQuerySerialization.NotSupportedException {
PrismContext prismContext = getPrismContext();
if (objectType == null) {
objectType = ObjectType.COMPLEX_TYPE;
Expand All @@ -545,8 +555,9 @@ private void updateRequestWithMidpointQuery(
prismContext.getSchemaRegistry().determineClassForTypeRequired(objectType);
ObjectQuery queryWithExprEvaluated = null;
if (midPointQueryScript != null) {
PrismPropertyValue<?> filterValue = ExpressionUtil.evaluateExpression(new VariablesMap(), null, midPointQueryScript,
MiscSchemaUtil.getExpressionProfile(), getPageBase().getExpressionFactory(), "", task, task.getResult());
PrismPropertyValue<?> filterValue = ExpressionUtil.evaluateExpression(
new VariablesMap(), null, midPointQueryScript, MiscSchemaUtil.getExpressionProfile(),
getPageBase().getExpressionFactory(), "", task, task.getResult());
if (filterValue != null) {
var realValue = filterValue.getRealValue();
if (realValue instanceof ObjectQuery objQuery) {
Expand All @@ -560,7 +571,7 @@ private void updateRequestWithMidpointQuery(
}
}
}
if (queryWithExprEvaluated == null) {
if (queryWithExprEvaluated == null && StringUtils.isNotBlank(queryText)) {
ObjectFilter filter = prismContext.createQueryParser().parseFilter(clazz, queryText);
ObjectQuery objectQuery = prismContext.queryFactory().createQuery(filter);
queryWithExprEvaluated = ExpressionUtil.evaluateQueryExpressions(
Expand Down

0 comments on commit c5f3ec7

Please sign in to comment.