Skip to content

Commit

Permalink
Update role-mining feature
Browse files Browse the repository at this point in the history
1. Fix and modification for GUI
2. Adjustment of pattern detection
3. Adjustment of clustering action
4. Handle process status
  • Loading branch information
tchrapovic committed Aug 23, 2023
1 parent b36c638 commit 2fcc322
Show file tree
Hide file tree
Showing 60 changed files with 1,724 additions and 1,076 deletions.
2 changes: 1 addition & 1 deletion config/sql/native-new/postgres-new.sql
Original file line number Diff line number Diff line change
Expand Up @@ -1201,7 +1201,7 @@ CREATE TABLE m_role_analysis_session_table (
CHECK (objectType = 'ROLE_ANALYSIS_SESSION'),
-- processedObjectCount INTEGER,
-- clusterCount INTEGER,
-- density DECIMAL,
-- clustersMeanDensity DECIMAL,
similarityOption DECIMAL,
minMembersOption INTEGER,
overlapOption INTEGER
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.gui.impl.page.admin.role.mining.page.page.PageRoleAnalysisCluster;

import com.evolveum.midpoint.gui.impl.page.admin.role.mining.page.page.PageRoleAnalysisSession;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
Expand Down Expand Up @@ -263,6 +267,9 @@ public final class WebComponentUtil {

OBJECT_DETAILS_PAGE_MAP.put(SimulationResultType.class, PageSimulationResult.class);
OBJECT_DETAILS_PAGE_MAP.put(MarkType.class, PageMark.class);

OBJECT_DETAILS_PAGE_MAP.put(RoleAnalysisSessionType.class, PageRoleAnalysisSession.class);
OBJECT_DETAILS_PAGE_MAP.put(RoleAnalysisClusterType.class, PageRoleAnalysisCluster.class);
}

// only pages that support 'advanced search' are currently listed here (TODO: generalize)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ protected InputPanel getPanel(PrismPropertyPanelContext<RangeType> panelCtx) {
return rangeSliderPanel;
}


@Override
public Integer getOrder() {
return 10000;
Expand All @@ -60,4 +61,6 @@ public Integer getOrder() {
@Override
public void configure(PrismPropertyPanelContext<RangeType> panelCtx, org.apache.wicket.Component component) {
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

import com.evolveum.midpoint.gui.impl.page.admin.abstractrole.AbstractRoleDetailsModel;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.objects.BusinessRoleApplicationDto;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.objects.BusinessRoleDto;

import com.evolveum.midpoint.model.api.ActivitySubmissionOptions;
import com.evolveum.midpoint.util.exception.*;
Expand All @@ -26,6 +27,7 @@
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.jetbrains.annotations.Nullable;

Expand Down Expand Up @@ -96,7 +98,7 @@ public AbstractPageObjectDetails(PrismObject<O> object) {
this(null, object, null);
}

private AbstractPageObjectDetails(PageParameters params, PrismObject<O> object, List<BusinessRoleApplicationDto> patternDeltas) {
private AbstractPageObjectDetails(PageParameters params, PrismObject<O> object, List<BusinessRoleDto> patternDeltas) {
super(params);
isAdd = (params == null || params.isEmpty()) && object == null;
objectDetailsModels = createObjectDetailsModels(object);
Expand All @@ -110,7 +112,7 @@ protected void postProcessModel(ODM objectDetailsModels) {

}

public AbstractPageObjectDetails(PrismObject<O> object, List<BusinessRoleApplicationDto> patternDeltas) {
public AbstractPageObjectDetails(PrismObject<O> object, List<BusinessRoleDto> patternDeltas) {
this(null, object, patternDeltas);
}

Expand Down Expand Up @@ -239,13 +241,33 @@ protected void savePerformed(AjaxRequestTarget target) {
AbstractPageObjectDetails.this.savePerformed(target);
}

@Override
protected void deleteConfirmPerformed(AjaxRequestTarget target) {
super.deleteConfirmPerformed(target);
AbstractPageObjectDetails.this.afterDeletePerformed(target);
}

@Override
protected boolean hasUnsavedChanges(AjaxRequestTarget target) {
return AbstractPageObjectDetails.this.hasUnsavedChanges(target);
}

@Override
public StringResourceModel getSaveButtonTitle() {
return setSaveButtonTitle();
}

@Override
protected boolean isSaveButtonVisible() {
return super.isSaveButtonVisible();
}
};
}

public StringResourceModel setSaveButtonTitle() {
return ((PageBase) getPage()).createStringResource("PageBase.button.save");
}

public boolean hasUnsavedChanges(AjaxRequestTarget target) {
OperationResult result = new OperationResult(OPERATION_SAVE);

Expand All @@ -263,6 +285,10 @@ public boolean hasUnsavedChanges(AjaxRequestTarget target) {
}
}

public void afterDeletePerformed(AjaxRequestTarget target) {

}

public void savePerformed(AjaxRequestTarget target) {
OperationResult result = new OperationResult(OPERATION_SAVE);
saveOrPreviewPerformed(target, result, false);
Expand Down Expand Up @@ -301,18 +327,18 @@ public Collection<ObjectDeltaOperation<? extends ObjectType>> saveOrPreviewPerfo
LOGGER.trace("returning from saveOrPreviewPerformed");

Collection<ObjectDeltaOperation<? extends ObjectType>> executedDeltas;
List<BusinessRoleApplicationDto> patternDeltas = ((AbstractRoleDetailsModel) getObjectDetailsModels()).getPatternDeltas();
if (patternDeltas != null && !patternDeltas.isEmpty()) {
BusinessRoleApplicationDto patternDeltas = ((AbstractRoleDetailsModel) getObjectDetailsModels()).getPatternDeltas();
if (patternDeltas != null && !patternDeltas.getBusinessRoleDtos().isEmpty()) {
executedDeltas = new ObjectChangesExecutorImpl()
.executeChanges(deltas, previewOnly, task, result, target);

String roleOid = ObjectDeltaOperation.findAddDeltaOidRequired(executedDeltas, RoleType.class);
clusterMigrationRecompute(result, patternDeltas.get(0).getClusterOid(), roleOid, (PageBase) getPage());
clusterMigrationRecompute(result, patternDeltas.getCluster().getOid(), roleOid, (PageBase) getPage());

PrismObject<RoleType> roleObject = getRoleTypeObject((PageBase) getPage(), roleOid, result);

if (roleObject != null) {
executeMigrationTask(result, task, patternDeltas, roleObject);
executeMigrationTask(result, task, patternDeltas.getBusinessRoleDtos(), roleObject);
}

} else {
Expand All @@ -329,7 +355,11 @@ public Collection<ObjectDeltaOperation<? extends ObjectType>> saveOrPreviewPerfo
return executedDeltas;
}

private void executeMigrationTask(OperationResult result, Task task, List<BusinessRoleApplicationDto> patternDeltas, PrismObject<RoleType> roleObject) {
public void executeAditionalChanges() {

}

private void executeMigrationTask(OperationResult result, Task task, List<BusinessRoleDto> patternDeltas, PrismObject<RoleType> roleObject) {
try {
ActivityDefinitionType activity = createActivity(patternDeltas, roleObject.getOid());

Expand All @@ -347,7 +377,7 @@ private void executeMigrationTask(OperationResult result, Task task, List<Busine
}
}

private ActivityDefinitionType createActivity(List<BusinessRoleApplicationDto> patternDeltas, String roleOid) throws SchemaException {
private ActivityDefinitionType createActivity(List<BusinessRoleDto> patternDeltas, String roleOid) throws SchemaException {

ObjectReferenceType objectReferenceType = new ObjectReferenceType();
objectReferenceType.setType(RoleType.COMPLEX_TYPE);
Expand All @@ -357,7 +387,7 @@ private ActivityDefinitionType createActivity(List<BusinessRoleApplicationDto> p
roleMembershipManagementWorkDefinitionType.setRoleRef(objectReferenceType);

ObjectSetType members = new ObjectSetType();
for (BusinessRoleApplicationDto patternDelta : patternDeltas) {
for (BusinessRoleDto patternDelta : patternDeltas) {
if (!patternDelta.isInclude()) {
continue;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,17 @@

package com.evolveum.midpoint.gui.impl.page.admin.abstractrole;

import org.apache.wicket.model.LoadableDetachableModel;

import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.impl.page.admin.focus.FocusDetailsModels;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.objects.BusinessRoleApplicationDto;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType;

import org.apache.wicket.model.LoadableDetachableModel;

import java.util.ArrayList;
import java.util.List;

public class AbstractRoleDetailsModel<AR extends AbstractRoleType> extends FocusDetailsModels<AR> {

private List<BusinessRoleApplicationDto> patternDeltas = new ArrayList<>();
private BusinessRoleApplicationDto patternDeltas;

public AbstractRoleDetailsModel(LoadableDetachableModel<PrismObject<AR>> prismObjectModel, PageBase serviceLocator) {
super(prismObjectModel, serviceLocator);
Expand All @@ -30,15 +27,12 @@ public AbstractRoleDetailsModel(LoadableDetachableModel<PrismObject<AR>> prismOb
super(prismObjectModel, history, serviceLocator);
}

public void setPatternDeltas(List<BusinessRoleApplicationDto> patternDeltas) {
public void setPatternDeltas(BusinessRoleApplicationDto patternDeltas) {
this.patternDeltas = patternDeltas;
}

public void addPatternDeltas(List<BusinessRoleApplicationDto> patternDeltas) {
this.patternDeltas.addAll(patternDeltas);
}

public List<BusinessRoleApplicationDto> getPatternDeltas() {
public BusinessRoleApplicationDto getPatternDeltas() {
return patternDeltas;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
import com.evolveum.midpoint.gui.impl.page.admin.focus.FocusDetailsModels;
import com.evolveum.midpoint.gui.impl.page.admin.focus.PageFocusDetails;
import com.evolveum.midpoint.gui.impl.page.admin.role.component.wizard.construction.ConstructionWizardPanel;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.objects.BusinessRoleApplicationDto;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.objects.BusinessRoleDto;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType;

Expand All @@ -32,7 +32,7 @@ public PageAbstractRole(PrismObject<AR> focus) {
super(focus);
}

public PageAbstractRole(PrismObject<AR> focus, List<BusinessRoleApplicationDto> patternDeltas) {
public PageAbstractRole(PrismObject<AR> focus, List<BusinessRoleDto> patternDeltas) {
super(focus, patternDeltas);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.api.component.MainObjectListPanel;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.objects.BusinessRoleApplicationDto;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.objects.BusinessRoleDto;
import com.evolveum.midpoint.web.component.AjaxIconButton;
import com.evolveum.midpoint.web.component.dialog.Popupable;
import com.evolveum.midpoint.web.component.util.SelectableBean;
Expand All @@ -36,10 +36,10 @@ public class CandidateAssignPanel extends BasePanel<String> implements Popupable
private static final String ID_PANELS = "table";
Set<String> existMembersOid = new HashSet<>();

public CandidateAssignPanel(String id, List<BusinessRoleApplicationDto> patternDeltas) {
public CandidateAssignPanel(String id, List<BusinessRoleDto> patternDeltas) {
super(id);

for (BusinessRoleApplicationDto bsApplicationDto : patternDeltas) {
for (BusinessRoleDto bsApplicationDto : patternDeltas) {
String oid = bsApplicationDto.getPrismObjectUser().getOid();
existMembersOid.add(oid);
}
Expand Down

0 comments on commit 2fcc322

Please sign in to comment.