Skip to content

Commit

Permalink
Use repository.searchContainers in AssignmentListPanels
Browse files Browse the repository at this point in the history
  • Loading branch information
tonydamage committed Jun 27, 2022
1 parent 67f1279 commit a13659d
Show file tree
Hide file tree
Showing 5 changed files with 178 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,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 Down Expand Up @@ -53,6 +54,7 @@
import com.evolveum.midpoint.web.component.AjaxIconButton;
import com.evolveum.midpoint.web.component.assignment.AssignmentPanel;
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 @@ -64,6 +66,7 @@
import com.evolveum.midpoint.web.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 @@ -82,11 +85,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 Down Expand Up @@ -530,12 +539,11 @@ public void deleteItemPerformed(AjaxRequestTarget target, List<PrismContainerVal
}

@Override
protected AssignmentListProvider createProvider() {
return createAssignmentProvider(getSearchModel(), loadValuesModel());
}

private AssignmentListProvider createAssignmentProvider(IModel<Search<AssignmentType>> searchModel, IModel<List<PrismContainerValueWrapper<AssignmentType>>> assignments) {
AssignmentListProvider assignmentListProvider = new AssignmentListProvider(AbstractAssignmentTypePanel.this, searchModel, assignments) {
protected ISelectableDataProvider<AssignmentType, PrismContainerValueWrapper<AssignmentType>> createProvider() {
var searchModel = getSearchModel();
var assignments = loadValuesModel();
var itemPath = model.getObject().getPath();
var assignmentListProvider = new RepoAssignmentListProvider(AbstractAssignmentTypePanel.this, searchModel, assignments, objectType, objectOid, itemPath) {

@Override
protected PageStorage getPageStorage() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,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 @@ -36,7 +36,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 @@ -29,6 +29,7 @@
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.logging.LoggingUtils;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
Expand Down Expand Up @@ -90,9 +91,10 @@ public Iterator<? extends PrismContainerValueWrapper<C>> internalIterator(long f
}

for (C object : list) {
WrapperContext context = new WrapperContext(task, result);
PrismContainerWrapperFactory<C> factory = getPageBase().findContainerWrapperFactory(object.asPrismContainerValue().getDefinition());
getAvailableData().add(factory.createValueWrapper(null, object.asPrismContainerValue(), ValueStatus.NOT_CHANGED, context));
PrismContainerValueWrapper<C> wrapper = createWrapper(object, task, result);
if (wrapper != null) {
getAvailableData().add(wrapper);
}
}
} catch (Exception ex) {
result.recordFatalError(getPageBase().createStringResource("ContainerListDataProvider.message.listContainers.fatalError").getString(), ex);
Expand All @@ -110,6 +112,14 @@ public Iterator<? extends PrismContainerValueWrapper<C>> internalIterator(long f
return getAvailableData().iterator();
}

@SuppressWarnings("unchecked")
protected PrismContainerValueWrapper<C> createWrapper(C object, Task task, OperationResult result) throws SchemaException {
WrapperContext context = new WrapperContext(task, result);
PrismContainerWrapperFactory<C> factory = getPageBase().findContainerWrapperFactory(object.asPrismContainerValue().getDefinition());
return (PrismContainerValueWrapper<C>) factory.createValueWrapper(null, object.asPrismContainerValue(), ValueStatus.NOT_CHANGED, context);
}


@Override
protected int internalSize() {
LOGGER.trace("begin::internalSize()");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
/*
* Copyright (C) 2021 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.web.component.util;

import com.evolveum.midpoint.gui.api.factory.wrapper.PrismContainerWrapperFactory;
import com.evolveum.midpoint.gui.api.factory.wrapper.WrapperContext;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.prism.Objectable;
import com.evolveum.midpoint.prism.PrismObject;
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.ObjectPaging;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.OwnedByFilter;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.logging.LoggingUtils;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.prism.ValueStatus;
import com.evolveum.midpoint.web.page.error.PageError;
import com.evolveum.midpoint.gui.impl.component.search.Search;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentHolderType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType;

import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;

import org.apache.wicket.Component;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
import org.apache.wicket.model.IModel;
import org.jetbrains.annotations.NotNull;

import java.util.Iterator;
import java.util.List;
import java.util.Objects;

public class RepoAssignmentListProvider extends ContainerListDataProvider<AssignmentType> {


private static final Trace LOGGER = TraceManager.getTrace(ContainerListDataProvider.class);
private static final String DOT_CLASS = ContainerListDataProvider.class.getName() + ".";
private static final String OPERATION_SEARCH_CONTAINERS = DOT_CLASS + "searchContainers";
private static final String OPERATION_COUNT_CONTAINERS = DOT_CLASS + "countContainers";


private final IModel<List<PrismContainerValueWrapper<AssignmentType>>> model;
private final String oid;
private final Class<? extends Objectable> objectType;
private final ItemPath path;

public RepoAssignmentListProvider(Component component, @NotNull IModel<Search<AssignmentType>> search, IModel<List<PrismContainerValueWrapper<AssignmentType>>> model,
Class<? extends Objectable> objectType, String oid, ItemPath path) {
super(component, search);
this.model = model;
this.oid = oid;
this.objectType = objectType;
this.path = path;
//setSort(new SortParam("targetRef.targetName.orig", true));
}

@Override
public Class<AssignmentType> getType() {
return AssignmentType.class;
}

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


@Override
protected PrismContainerValueWrapper<AssignmentType> createWrapper(AssignmentType object, Task task,
OperationResult result) throws SchemaException {
for (PrismContainerValueWrapper<AssignmentType> item : model.getObject()) {
if (Objects.equals(item.getRealValue().getId(),object.getId())) {
postProcessWrapper(item);
return item;
}
}
// FIXME: Should not happen? Could possibly, if user was modified in other session
// or role has assignments and inducements and ownedBy filter is not supported
// Lets silently skip the item for now (by returning null)
return null;
}

protected void postProcessWrapper(PrismContainerValueWrapper<AssignmentType> valueWrapper) {
AssignmentType assignmentType = valueWrapper.getRealValue();
if (assignmentType == null) {
return;
}
ObjectReferenceType targetRef = assignmentType.getTargetRef();
if (targetRef == null || targetRef.getOid() == null || targetRef.getObject() != null) {
return;
}

PrismObject<? extends ObjectType> object = WebModelServiceUtils.loadObject(targetRef, getPageBase());
targetRef.asReferenceValue().setObject(object);
}

// We need to add oid selector to the query
@Override
public ObjectQuery getQuery() {
var orig = super.getQuery();
ObjectFilter filter = orig != null ? orig.getFilter() : null;
if (orig != null) {
filter = orig.getFilter();
}
if (filter != null) {
return QueryBuilder.queryFor(AssignmentType.class, getPrismContext())
.filter(filter)
.and()
.ownedBy(objectType, path)
.id(oid)
.build();
}
return QueryBuilder.queryFor(AssignmentType.class, getPrismContext())
.ownedBy(objectType, path)
.id(oid)
.build();
}

@Override
public void detach() {
for (PrismContainerValueWrapper<AssignmentType> assignment : getAvailableData()) {
AssignmentType assignmentType = assignment.getRealValue();
if (assignmentType == null) {
continue;
}
ObjectReferenceType ref = assignmentType.getTargetRef();
if (ref == null) {
continue;
}
if (ref.getObject() != null) {
ref.asReferenceValue().setObject(null);
}
}
}
}

0 comments on commit a13659d

Please sign in to comment.