Skip to content

Commit

Permalink
Update role-mining feature
Browse files Browse the repository at this point in the history
  • Loading branch information
tchrapovic committed Aug 14, 2023
1 parent 40a7818 commit 34f2e7e
Show file tree
Hide file tree
Showing 33 changed files with 908 additions and 1,526 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
/*
* Copyright (C) 2010-2020 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.gui.impl.factory.panel;

import com.evolveum.midpoint.gui.api.prism.wrapper.ItemWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismPropertyWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismValueWrapper;
import com.evolveum.midpoint.gui.api.util.ObjectTypeListUtil;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.components.RangeSliderPanel;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.web.component.input.DropDownChoicePanel;
import com.evolveum.midpoint.web.component.input.QNameObjectTypeChoiceRenderer;
import com.evolveum.midpoint.web.component.prism.InputPanel;
import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnChangeAjaxFormUpdatingBehavior;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;

import jakarta.annotation.PostConstruct;
import org.apache.wicket.model.Model;
import org.springframework.stereotype.Component;

import javax.xml.namespace.QName;
import java.util.List;

@Component
public class RangePanelFactory extends AbstractInputGuiComponentFactory<Double> {

@PostConstruct
public void register() {
getRegistry().addToRegistry(this);
}

@Override
public <IW extends ItemWrapper<?, ?>, VW extends PrismValueWrapper<?>> boolean match(IW wrapper, VW valueWrapper) {
return RoleAnalysisSessionOptionType.F_SIMILARITY_THRESHOLD.equals(wrapper.getItemName());
}

@Override
protected InputPanel getPanel(PrismPropertyPanelContext<Double> panelCtx) {
List<QName> typesList;
// if (AssignmentType.F_FOCUS_TYPE.equals(panelCtx.getDefinitionName())
// || ItemPath.create(
// ResourceType.F_SCHEMA_HANDLING,
// SchemaHandlingType.F_OBJECT_TYPE,
// ResourceObjectTypeDefinitionType.F_FOCUS,
// ResourceObjectFocusSpecificationType.F_TYPE)
// .equivalent(panelCtx.unwrapWrapperModel().getPath().namedSegmentsOnly())) {
// typesList = ObjectTypeListUtil.createFocusTypeList();
// } else if ((ObjectCollectionType.F_TYPE.equals(panelCtx.getDefinitionName()) || GuiObjectListViewType.F_TYPE.equals(panelCtx.getDefinitionName()))
// && panelCtx.unwrapWrapperModel().getParent().getDefinition() != null &&
// (ObjectCollectionType.class.equals(panelCtx.unwrapWrapperModel().getParent().getDefinition().getTypeClass())
// || GuiObjectListViewType.class.equals(panelCtx.unwrapWrapperModel().getParent().getDefinition().getTypeClass()))) {
// typesList = ObjectTypeListUtil.createContainerableTypesQnameList();
// } else {
// typesList = ObjectTypeListUtil.createObjectTypeList();
// }



RangeSliderPanel rangeSliderPanel = new RangeSliderPanel(panelCtx.getComponentId(),panelCtx.getRealValueModel());
// DropDownChoicePanel<QName> typePanel = new DropDownChoicePanel<QName>(panelCtx.getComponentId(), panelCtx.getRealValueModel(),
// Model.ofList(typesList), new QNameObjectTypeChoiceRenderer(), true);
rangeSliderPanel.getBaseFormComponent().add(new EmptyOnChangeAjaxFormUpdatingBehavior());
rangeSliderPanel.setOutputMarkupId(true);
return rangeSliderPanel;
}

@Override
public Integer getOrder() {
return 10000;
}


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

import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.algorithm.object.ClusterOptions;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.page.MainPageMining;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.page.PageRoleAnalysisSession;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
Expand Down Expand Up @@ -41,6 +43,8 @@ public ClusteringAction(RoleAnalysisProcessModeType mode) {
public void execute(@NotNull PageBase pageBase, @NotNull ClusterOptions clusterOptions,
@NotNull OperationResult operationResult, @NotNull Task task) {

System.out.println(clusterOptions.getSimilarity());
clusterOptions.setSimilarity(clusterOptions.getSimilarity() / 100);
RoleAnalysisSessionOptionType roleAnalysisSessionClusterOption = getRoleAnalysisSessionFilterOption(clusterOptions);

RoleAnalysisDetectionOptionType roleAnalysisSessionDetectionOption = getRoleAnalysisSessionDetectionOption(clusterOptions);
Expand All @@ -51,17 +55,19 @@ public void execute(@NotNull PageBase pageBase, @NotNull ClusterOptions clusterO
importObjects(clusterObjects, clusterOptions,
roleAnalysisSessionClusterOption, roleAnalysisSessionDetectionOption, pageBase, operationResult, task);

pageBase.setResponsePage(MainPageMining.class);

}

@NotNull
private RoleAnalysisDetectionOptionType getRoleAnalysisSessionDetectionOption(ClusterOptions clusterOptions) {
RoleAnalysisDetectionOptionType roleAnalysisSessionDetectionOption = new RoleAnalysisDetectionOptionType();
roleAnalysisSessionDetectionOption.setDetectionMode(clusterOptions.getSearchMode());
// roleAnalysisSessionDetectionOption.setDetectionMode(clusterOptions.getSearchMode());
roleAnalysisSessionDetectionOption.setMinFrequencyThreshold(clusterOptions.getDefaultMinFrequency());
roleAnalysisSessionDetectionOption.setMaxFrequencyThreshold(clusterOptions.getDefaultMaxFrequency());
roleAnalysisSessionDetectionOption.setMinMembersOccupancy(clusterOptions.getDefaultOccupancySearch());
roleAnalysisSessionDetectionOption.setMinPropertiesOccupancy(clusterOptions.getDefaultIntersectionSearch());
roleAnalysisSessionDetectionOption.setJaccardSimilarityThreshold(clusterOptions.getDefaultJaccardThreshold());
roleAnalysisSessionDetectionOption.setDetectionProcessMode(clusterOptions.getDetect());

return roleAnalysisSessionDetectionOption;
}
Expand Down Expand Up @@ -123,10 +129,10 @@ private void importObjects(List<PrismObject<RoleAnalysisClusterType>> clusters,
try {
int counter = 1;
for (PrismObject<RoleAnalysisClusterType> clusterTypePrismObject : clusters) {
System.out.println("IMPORT CLUSTER: "+counter+"/"+clusters.size());
System.out.println("IMPORT CLUSTER: " + counter + "/" + clusters.size());
importRoleAnalysisClusterObject(result, task, pageBase, clusterTypePrismObject, parentRef,
roleAnalysisSessionDetectionOption);
System.out.println("END IMPORTING CLUSTER: "+counter+"/"+clusters.size());
System.out.println("END IMPORTING CLUSTER: " + counter + "/" + clusters.size());
counter++;

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

package com.evolveum.midpoint.gui.impl.page.admin.role.mining.algorithm.detection;

import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleAnalysisDetectionModeType;

import java.io.Serializable;
import java.util.Set;
Expand All @@ -22,18 +21,15 @@ public class DetectedPattern implements Serializable {
Set<String> members;
Set<String> memberTypeObjectOccupation;
Double clusterMetric;
RoleAnalysisDetectionModeType searchMode;
Long id;

public DetectedPattern(Set<String> properties, Set<String> members,
double clusterMetric,
Set<String> memberTypeObjectOccupation,
RoleAnalysisDetectionModeType searchMode, Long id) {
Set<String> memberTypeObjectOccupation, Long id) {
this.properties = properties;
this.members = members;
this.clusterMetric = clusterMetric;
this.memberTypeObjectOccupation = memberTypeObjectOccupation;
this.searchMode = searchMode;
this.id = id;
}

Expand All @@ -57,10 +53,6 @@ public double getClusterMetric() {
return clusterMetric;
}

public RoleAnalysisDetectionModeType getSearchMode() {
return searchMode;
}

public Set<String> getMemberTypeObjectOccupation() {
return memberTypeObjectOccupation;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.algorithm.object.DetectionOption;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.objects.MiningRoleTypeChunk;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.objects.MiningUserTypeChunk;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleAnalysisDetectionModeType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleAnalysisProcessModeType;

public class DetectionAction implements Serializable {
Expand All @@ -23,11 +22,7 @@ public class DetectionAction implements Serializable {

public DetectionAction(DetectionOption detectionOption) {
this.detectionOption = detectionOption;
if (detectionOption.getSearchMode().equals(RoleAnalysisDetectionModeType.JACCARD)) {
detectionType = new ExtractJaccard();
} else {
detectionType = new ExtractIntersections();
}
detectionType = new ExtractIntersections();
}

public List<DetectedPattern> executeDetection(List<MiningRoleTypeChunk> miningRoleTypeChunks,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public List<DetectedPattern> performUserBasedDetection(List<MiningRoleTypeChunk>
double maxFrequency = roleAnalysisSessionDetectionOptionType.getMaxFrequencyThreshold();
int minIntersection = roleAnalysisSessionDetectionOptionType.getMinPropertiesOverlap();
int minOccupancy = roleAnalysisSessionDetectionOptionType.getMinOccupancy();
double similarity = roleAnalysisSessionDetectionOptionType.getJaccardSimilarityThreshold();
double similarity = 0.8;

List<DetectedPattern> detectedPatterns = new ArrayList<>();
List<MiningRoleTypeChunk> preparedObjects = new ArrayList<>();
Expand Down Expand Up @@ -123,7 +123,7 @@ public List<DetectedPattern> performRoleBasedDetection(List<MiningUserTypeChunk>
double maxFrequency = roleAnalysisSessionDetectionOptionType.getMaxFrequencyThreshold();
int minIntersection = roleAnalysisSessionDetectionOptionType.getMinPropertiesOverlap();
int minOccupancy = roleAnalysisSessionDetectionOptionType.getMinOccupancy();
double similarity = roleAnalysisSessionDetectionOptionType.getJaccardSimilarityThreshold();
double similarity = 0.8;

List<DetectedPattern> intersections = new ArrayList<>();
List<MiningUserTypeChunk> preparedObjects = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,32 @@
import java.io.Serializable;

import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.utils.ClusterObjectUtils;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleAnalysisDetectionModeType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleAnalysisDetectionProcessType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleAnalysisProcessModeType;

public class ClusterOptions implements Serializable {
public ClusterOptions(PageBase pageBase, double similarity, int minGroupSize, int minMembers, int minIntersections,
ObjectFilter query, int minProperties, int maxProperties, RoleAnalysisProcessModeType mode, String name, RoleAnalysisDetectionProcessType detect,
int defaultIntersectionSearch, int defaultOccupancySearch, double defaultMinFrequency,
double defaultMaxFrequency) {
this.pageBase = pageBase;
this.similarity = similarity;
this.minGroupSize = minGroupSize;
this.minMembers = minMembers;
this.minIntersections = minIntersections;
this.query = query;
this.minProperties = minProperties;
this.maxProperties = maxProperties;
this.mode = mode;
this.name = name;
this.detect = detect;
this.defaultIntersectionSearch = defaultIntersectionSearch;
this.defaultOccupancySearch = defaultOccupancySearch;
this.defaultMinFrequency = defaultMinFrequency;
this.defaultMaxFrequency = defaultMaxFrequency;
}

private PageBase pageBase;
private double similarity;
private int minGroupSize;
Expand All @@ -25,20 +45,17 @@ public class ClusterOptions implements Serializable {
private int minProperties;
private int maxProperties;
RoleAnalysisProcessModeType mode;
RoleAnalysisDetectionModeType searchMode;
String name;
ClusterObjectUtils.DETECT detect;
RoleAnalysisDetectionProcessType detect;

int defaultIntersectionSearch = 10;
int defaultOccupancySearch = 5;
double defaultMinFrequency = 0.3;
double defaultMaxFrequency = 1;
double defaultJaccardThreshold = 0.8;

public ClusterOptions(PageBase pageBase, RoleAnalysisProcessModeType mode, RoleAnalysisDetectionModeType searchMode) {
public ClusterOptions(PageBase pageBase, RoleAnalysisProcessModeType mode) {
this.pageBase = pageBase;
this.mode = mode;
this.searchMode = searchMode;
setDefaultOptions(mode);
}

Expand Down Expand Up @@ -163,22 +180,6 @@ public void setDefaultMaxFrequency(double defaultMaxFrequency) {
this.defaultMaxFrequency = defaultMaxFrequency;
}

public RoleAnalysisDetectionModeType getSearchMode() {
return searchMode;
}

public void setSearchMode(RoleAnalysisDetectionModeType searchMode) {
this.searchMode = searchMode;
}

public double getDefaultJaccardThreshold() {
return defaultJaccardThreshold;
}

public void setDefaultJaccardThreshold(double defaultJaccardThreshold) {
this.defaultJaccardThreshold = defaultJaccardThreshold;
}

public int getMaxProperties() {
return maxProperties;
}
Expand All @@ -187,11 +188,11 @@ public void setMaxProperties(int maxProperties) {
this.maxProperties = maxProperties;
}

public ClusterObjectUtils.DETECT getDetect() {
public RoleAnalysisDetectionProcessType getDetect() {
return detect;
}

public void setDetect(ClusterObjectUtils.DETECT detect) {
public void setDetect(RoleAnalysisDetectionProcessType detect) {
this.detect = detect;
}

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

import java.io.Serializable;

import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleAnalysisDetectionModeType;

public class DetectionOption implements Serializable {

Expand All @@ -12,7 +11,6 @@ public class DetectionOption implements Serializable {
Integer minOccupancy;
double maxFrequencyThreshold;
Integer minPropertiesOverlap;
RoleAnalysisDetectionModeType searchMode;

public double getMinFrequencyThreshold() {
return minFrequencyThreshold;
Expand Down Expand Up @@ -46,30 +44,13 @@ public void setMinPropertiesOverlap(Integer minPropertiesOverlap) {
this.minPropertiesOverlap = minPropertiesOverlap;
}

public RoleAnalysisDetectionModeType getSearchMode() {
return searchMode;
}

public void setSearchMode(RoleAnalysisDetectionModeType searchMode) {
this.searchMode = searchMode;
}

public Double getJaccardSimilarityThreshold() {
return jaccardSimilarityThreshold;
}

public void setJaccardSimilarityThreshold(Double jaccardSimilarityThreshold) {
this.jaccardSimilarityThreshold = jaccardSimilarityThreshold;
}

Double jaccardSimilarityThreshold;

public DetectionOption(double minFrequencyThreshold, double maxFrequencyThreshold, Integer minOccupancy, Integer minPropertiesOverlap, RoleAnalysisDetectionModeType searchMode, Double jaccardSimilarityThreshold) {
public DetectionOption(double minFrequencyThreshold, double maxFrequencyThreshold, Integer minOccupancy, Integer minPropertiesOverlap) {
this.minFrequencyThreshold = minFrequencyThreshold;
this.minOccupancy = minOccupancy;
this.maxFrequencyThreshold = maxFrequencyThreshold;
this.minPropertiesOverlap = minPropertiesOverlap;
this.searchMode = searchMode;
this.jaccardSimilarityThreshold = jaccardSimilarityThreshold;
}
}

0 comments on commit 34f2e7e

Please sign in to comment.