Skip to content

Commit

Permalink
Merge branch 'feature/assignment-search'
Browse files Browse the repository at this point in the history
  • Loading branch information
tonydamage committed Jun 13, 2022
2 parents 6358a98 + acf3781 commit fb012f7
Show file tree
Hide file tree
Showing 15 changed files with 457 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
package com.evolveum.midpoint.gui.impl.page.admin.assignmentholder.component.assignmentType;

import java.util.*;
import java.util.stream.Collectors;

import javax.xml.namespace.QName;

import com.evolveum.midpoint.gui.impl.component.search.AbstractSearchItemWrapper;
Expand All @@ -19,6 +21,7 @@
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;

Expand All @@ -28,6 +31,7 @@
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismObjectValueWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismReferenceWrapper;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
Expand All @@ -50,10 +54,12 @@
import com.evolveum.midpoint.security.api.AuthorizationConstants;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.exception.TunnelException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.AjaxIconButton;
import com.evolveum.midpoint.web.component.assignment.AssignmentsUtil;
import com.evolveum.midpoint.web.component.data.ISelectableDataProvider;
import com.evolveum.midpoint.web.component.data.column.AjaxLinkColumn;
import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn;
import com.evolveum.midpoint.web.component.data.column.ColumnMenuAction;
Expand All @@ -65,6 +71,7 @@
import com.evolveum.midpoint.gui.impl.component.search.SearchFactory;
import com.evolveum.midpoint.web.component.search.SearchItemDefinition;
import com.evolveum.midpoint.web.component.util.AssignmentListProvider;
import com.evolveum.midpoint.web.component.util.RepoAssignmentListProvider;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.session.GenericPageStorage;
import com.evolveum.midpoint.web.session.PageStorage;
Expand All @@ -83,11 +90,17 @@ public abstract class AbstractAssignmentTypePanel extends MultivalueContainerLis
private IModel<PrismContainerWrapper<AssignmentType>> model;
protected int assignmentsRequestsLimit = -1;

public AbstractAssignmentTypePanel(String id, IModel<PrismContainerWrapper<AssignmentType>> model, ContainerPanelConfigurationType config) {
private Class<? extends Objectable> objectType;
private String objectOid;

public AbstractAssignmentTypePanel(String id, IModel<PrismContainerWrapper<AssignmentType>> model, ContainerPanelConfigurationType config, Class<? extends Objectable> type, String oid) {
super(id, AssignmentType.class, config);
this.model = model;
this.objectType = type;
this.objectOid = oid;
}


protected void setModel(IModel<PrismContainerWrapper<AssignmentType>> model) {
this.model = model;
}
Expand All @@ -103,6 +116,10 @@ protected boolean isCreateNewObjectVisible() {
return isNewObjectButtonVisible(getFocusObject());
}

protected boolean isRepositorySearchEnabled() {
return getPageBase().getCompiledGuiProfile().isUseRepositoryAssignmentSearch();
}

@Override
protected IModel<PrismContainerWrapper<AssignmentType>> getContainerModel() {
return model;
Expand All @@ -113,6 +130,7 @@ protected void cancelItemDetailsPerformed(AjaxRequestTarget target) {
target.add(AbstractAssignmentTypePanel.this);
}

@Override
protected List<IColumn<PrismContainerValueWrapper<AssignmentType>, String>> createDefaultColumns() {
List<IColumn<PrismContainerValueWrapper<AssignmentType>, String>> columns = new ArrayList<>();
columns.add(new PrismContainerWrapperColumn<>(getContainerModel(), AssignmentType.F_ACTIVATION, getPageBase()));
Expand Down Expand Up @@ -530,12 +548,38 @@ public void deleteItemPerformed(AjaxRequestTarget target, List<PrismContainerVal
}

@Override
protected AssignmentListProvider createProvider() {
return createAssignmentProvider(getSearchModel(), loadValuesModel());
protected ISelectableDataProvider<AssignmentType, PrismContainerValueWrapper<AssignmentType>> createProvider() {
var searchModel = getSearchModel();
var assignments = loadValuesModel();
return isRepositorySearchEnabled() ? createRepositoryProvider(searchModel, assignments) : createInMemoryProvider(searchModel, assignments);
}

private AssignmentListProvider createAssignmentProvider(IModel<Search<AssignmentType>> searchModel, IModel<List<PrismContainerValueWrapper<AssignmentType>>> assignments) {
AssignmentListProvider assignmentListProvider = new AssignmentListProvider(AbstractAssignmentTypePanel.this, searchModel, assignments) {
protected AssignmentListProvider createInMemoryProvider(IModel<Search<AssignmentType>> searchModel, IModel<List<PrismContainerValueWrapper<AssignmentType>>> assignments) {
var provider = new AssignmentListProvider(AbstractAssignmentTypePanel.this, searchModel, assignments) {

@Override
protected PageStorage getPageStorage() {
return AbstractAssignmentTypePanel.this.getPageStorage();
}

@Override
protected List<PrismContainerValueWrapper<AssignmentType>> postFilter(List<PrismContainerValueWrapper<AssignmentType>> assignmentList) {
return customPostSearch(assignmentList);
}

@Override
protected ObjectQuery getCustomizeContentQuery() {
return AbstractAssignmentTypePanel.this.getCustomizeQuery();
}
};
provider.setCompiledObjectCollectionView(getObjectCollectionView());
return provider;
}

protected RepoAssignmentListProvider createRepositoryProvider(IModel<Search<AssignmentType>> searchModel, IModel<List<PrismContainerValueWrapper<AssignmentType>>> assignments) {

var itemPath = model.getObject().getPath();
var assignmentListProvider = new RepoAssignmentListProvider(AbstractAssignmentTypePanel.this, searchModel, assignments, objectType, objectOid, itemPath) {

@Override
protected PageStorage getPageStorage() {
Expand Down Expand Up @@ -566,6 +610,17 @@ protected List<PrismContainerValueWrapper<AssignmentType>> customPostSearch(List

protected abstract ObjectQuery getCustomizeQuery();

protected List<PrismContainerValueWrapper<AssignmentType>> prefilterUsingQuery(
List<PrismContainerValueWrapper<AssignmentType>> list, ObjectQuery query) {
return list.stream().filter(valueWrapper -> {
try {
return ObjectQuery.match(valueWrapper.getRealValue(), query.getFilter(), getPageBase().getMatchingRuleRegistry());
} catch (SchemaException e) {
throw new TunnelException(e.getMessage());
}
}).collect(Collectors.toList());
}

@Override
protected MultivalueContainerDetailsPanel<AssignmentType> getMultivalueContainerDetailsPanel(
ListItem<PrismContainerValueWrapper<AssignmentType>> item) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,7 @@ public abstract class AbstractAssignmentPanel<AH extends AssignmentHolderType> e
private static final Trace LOGGER = TraceManager.getTrace(AbstractAssignmentPanel.class);

public AbstractAssignmentPanel(String id, IModel<PrismObjectWrapper<AH>> model, ContainerPanelConfigurationType config) {
super(id, null, config);

super(id, null, config, model.getObject().getTypeClass(), model.getObject().getOid());
setModel(PrismContainerWrapperModel.fromContainerWrapper(model, AssignmentHolderType.F_ASSIGNMENT, (Supplier<PageBase> & Serializable) () -> getPageBase()));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,14 @@
*/
package com.evolveum.midpoint.gui.impl.page.admin.assignmentholder.component.assignmentType.assignment;

import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismObjectWrapper;
import com.evolveum.midpoint.gui.impl.page.admin.assignmentholder.component.AssignmentHolderAssignmentPanel;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.exception.TunnelException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.application.PanelDisplay;
Expand All @@ -25,6 +28,7 @@
import javax.xml.namespace.QName;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@PanelType(name = "focusMappingsAssignments")
@PanelInstance(identifier = "focusMappingsAssignments",
Expand Down Expand Up @@ -57,9 +61,27 @@ protected List<SearchItemDefinition> createSearchableItems(PrismContainerDefinit
return defs;
}

@Override
protected ObjectQuery getCustomizeQuery() {
protected ObjectQuery createCustomizeQuery() {
return getPageBase().getPrismContext().queryFor(AssignmentType.class)
.exists(AssignmentType.F_FOCUS_MAPPINGS).build();
}

@Override
protected ObjectQuery getCustomizeQuery() {
// CustomizeQuery is not repo indexed
if (isRepositorySearchEnabled()) {
return null;
}
return createCustomizeQuery();
}

@Override
protected List<PrismContainerValueWrapper<AssignmentType>> customPostSearch(
List<PrismContainerValueWrapper<AssignmentType>> list) {
// customizeQuery is not repository supported, so we need to prefilter list using in-memory search
if (isRepositorySearchEnabled()) {
return prefilterUsingQuery(list, createCustomizeQuery());
}
return super.customPostSearch(list);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,18 @@
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.annotation.Nullable;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismObjectWrapper;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.gui.impl.page.admin.assignmentholder.component.AssignmentHolderAssignmentPanel;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.impl.query.builder.QueryBuilder;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.schema.util.FocusTypeUtil;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.QNameUtil;
Expand All @@ -40,6 +44,15 @@ public GenericAbstractRoleAssignmentPanel(String id, IModel<PrismObjectWrapper<F
super(id, assignmentContainerWrapperModel, config);
}

@Override
protected ObjectQuery getCustomizeQuery() {
// This should do customPostSearch on repository level.
return QueryBuilder.queryFor(AssignmentType.class, getPrismContext())
.ref(AssignmentType.F_TARGET_REF, OrgType.COMPLEX_TYPE, null)
.item(ObjectType.F_SUBTYPE).contains("access")
.build();
}

@Override
protected List<PrismContainerValueWrapper<AssignmentType>> customPostSearch(List<PrismContainerValueWrapper<AssignmentType>> assignments) {

Expand All @@ -58,18 +71,16 @@ protected List<PrismContainerValueWrapper<AssignmentType>> customPostSearch(List
}
if (QNameUtil.match(assignment.getTargetRef().getType(), OrgType.COMPLEX_TYPE)) {
PrismObject<OrgType> org = WebModelServiceUtils.loadObject(assignment.getTargetRef(), getPageBase(), task, task.getResult());
if (org != null) {
if (FocusTypeUtil.determineSubTypes(org).contains("access")) {
resultList.add(ass);
}
if (org != null && FocusTypeUtil.determineSubTypes(org).contains("access")) {
resultList.add(ass);
}
}

}

return resultList;
}

@Override
protected ObjectFilter getSubtypeFilter(){
return getPageBase().getPrismContext().queryFor(OrgType.class)
.block()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ public PolicyRuleAssignmentsPanel(String id, IModel<PrismObjectWrapper<AH>> mode
super(id, model, config);
}

@Override
protected List<IColumn<PrismContainerValueWrapper<AssignmentType>, String>> initColumns() {
List<IColumn<PrismContainerValueWrapper<AssignmentType>, String>> columns = new ArrayList<>();

Expand Down Expand Up @@ -93,8 +94,8 @@ protected void newAssignmentClickPerformed(AjaxRequestTarget target) {
itemDetailsPerformed(target, Collections.singletonList(newAssignmentWrapper));
}

@Override
protected ObjectQuery getCustomizeQuery() {

protected ObjectQuery createCustomizeQuery() {
return getPageBase().getPrismContext().queryFor(AssignmentType.class)
.exists(AssignmentType.F_POLICY_RULE).build();
}
Expand Down Expand Up @@ -129,5 +130,22 @@ protected List<? super AbstractSearchItemWrapper> createSearchableItemWrappers(P
return defs;
}

@Override
protected ObjectQuery getCustomizeQuery() {
// CustomizeQuery is not repo indexed
if (isRepositorySearchEnabled()) {
return null;
}
return createCustomizeQuery();
}

@Override
protected List<PrismContainerValueWrapper<AssignmentType>> customPostSearch(
List<PrismContainerValueWrapper<AssignmentType>> list) {
// customizeQuery is not repository supported, so we need to prefilter list using in-memory search
if (isRepositorySearchEnabled()) {
return prefilterUsingQuery(list, createCustomizeQuery());
}
return super.customPostSearch(list);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
public class AbstractInducementPanel<AR extends AbstractRoleType> extends AbstractAssignmentTypePanel {

public AbstractInducementPanel(String id, IModel<PrismObjectWrapper<AR>> model, ContainerPanelConfigurationType config) {
super(id, null, config);
super(id, null, config, model.getObject().getTypeClass(), model.getObject().getOid());

setModel(PrismContainerWrapperModel.fromContainerWrapper(model, AbstractRoleType.F_INDUCEMENT, (Supplier<PageBase> & Serializable) () -> getPageBase()));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/
package com.evolveum.midpoint.gui.impl.page.admin.assignmentholder.component.assignmentType.inducement;

import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismObjectWrapper;
import com.evolveum.midpoint.gui.impl.page.admin.abstractrole.component.AbstractRoleInducementPanel;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
Expand Down Expand Up @@ -48,9 +49,27 @@ protected List<SearchItemDefinition> createSearchableItems(PrismContainerDefinit
return defs;
}

protected ObjectQuery createCustomizeQuery() {
return getPageBase().getPrismContext().queryFor(AssignmentType.class)
.exists(AssignmentType.F_FOCUS_MAPPINGS).build();
}

@Override
protected ObjectQuery getCustomizeQuery() {
return PrismContext.get().queryFor(AssignmentType.class)
.exists(AssignmentType.F_FOCUS_MAPPINGS).build();
// CustomizeQuery is not repo indexed
if (isRepositorySearchEnabled()) {
return null;
}
return createCustomizeQuery();
}

@Override
protected List<PrismContainerValueWrapper<AssignmentType>> customPostSearch(
List<PrismContainerValueWrapper<AssignmentType>> list) {
// customizeQuery is not repository supported, so we need to prefilter list using in-memory search
if (isRepositorySearchEnabled()) {
return prefilterUsingQuery(list, createCustomizeQuery());
}
return super.customPostSearch(list);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import com.evolveum.midpoint.gui.impl.page.admin.AbstractPageObjectDetails;
import com.evolveum.midpoint.gui.impl.page.admin.abstractrole.component.AbstractRoleInducementPanel;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.impl.query.builder.QueryBuilder;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
Expand Down Expand Up @@ -175,6 +176,7 @@ private ConstructionAssociationPanel getConstructionAssociationPanel(String idPa
return constructionDetailsPanel;
}

@Override
protected List<ObjectTypes> getObjectTypesList() {
return Collections.singletonList(ObjectTypes.RESOURCE);
}
Expand Down

0 comments on commit fb012f7

Please sign in to comment.