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 2, 2023
1 parent 1891642 commit 38eecc1
Show file tree
Hide file tree
Showing 60 changed files with 2,686 additions and 1,999 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import static com.evolveum.midpoint.gui.api.component.mining.analyse.tools.grouper.Preparer.prepareMiningSetIntersected;
import static com.evolveum.midpoint.gui.api.component.mining.analyse.tools.jaccard.JacquardSorter.sortUserSets;
import static com.evolveum.midpoint.gui.api.component.mining.analyse.tools.jaccard.JacquardSorter.sortUserSetsJc;
import static com.evolveum.midpoint.gui.impl.page.admin.role.mining.tables.Tools.getScaleScript;
import static com.evolveum.midpoint.gui.impl.page.admin.role.mining.utils.Tools.getScaleScript;

import java.util.ArrayList;
import java.util.Arrays;
Expand Down

This file was deleted.

This file was deleted.

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

import java.util.List;

import com.evolveum.midpoint.gui.impl.page.admin.role.mining.algorithm.object.ClusterOptions;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleAnalysisClusterType;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,16 @@

import java.util.List;

import com.evolveum.midpoint.gui.impl.page.admin.role.mining.algorithm.object.ClusterOptions;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleAnalysisClusterType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleAnalysisProcessModeType;

public class ClusteringExecutor {
public class ClusteringAction {

private Clusterable clusterable;

public ClusteringExecutor(RoleAnalysisProcessModeType mode) {
public ClusteringAction(RoleAnalysisProcessModeType mode) {
if (mode.equals(RoleAnalysisProcessModeType.USER)) {
this.clusterable = new UserBasedClustering();
} else if (mode.equals(RoleAnalysisProcessModeType.ROLE)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,15 @@

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

import static com.evolveum.midpoint.gui.impl.page.admin.role.mining.tables.Tools.endTimer;
import static com.evolveum.midpoint.gui.impl.page.admin.role.mining.tables.Tools.startTimer;
import static com.evolveum.midpoint.gui.impl.page.admin.role.mining.utils.Tools.endTimer;
import static com.evolveum.midpoint.gui.impl.page.admin.role.mining.utils.Tools.startTimer;

import java.util.Collections;
import java.util.List;

import com.evolveum.midpoint.gui.impl.page.admin.role.mining.algorithm.object.ClusterOptions;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.algorithm.object.DataPoint;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.algorithm.utils.ClusterAlgorithmUtils;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleAnalysisClusterType;

import com.google.common.collect.ArrayListMultimap;
Expand All @@ -36,8 +39,6 @@

public class RoleBasedClustering implements Clusterable {

OperationResult operationResult = new OperationResult("Map UserType object for clustering");

@Override
public List<PrismObject<RoleAnalysisClusterType>> executeClustering(ClusterOptions clusterOptions) {
long start = startTimer(" prepare clustering object");
Expand All @@ -48,6 +49,7 @@ public List<PrismObject<RoleAnalysisClusterType>> executeClustering(ClusterOptio

PageBase pageBase = clusterOptions.getPageBase();
ObjectFilter query = clusterOptions.getQuery();
OperationResult operationResult = new OperationResult("ExecuteRoleBasedClustering");
ListMultimap<List<String>, String> chunkMap = loadData(operationResult, pageBase,
threshold, maxProperties, query);
List<DataPoint> dataPoints = ClusterAlgorithmUtils.prepareDataPoints(chunkMap);
Expand All @@ -59,7 +61,7 @@ public List<PrismObject<RoleAnalysisClusterType>> executeClustering(ClusterOptio

//TODO
if (eps == 0.0) {
return new ClusterAlgorithmUtils().processIdenticalGroup(pageBase, dataPoints, clusterOptions);
return new ClusterAlgorithmUtils().processExactMatch(pageBase, dataPoints, clusterOptions);
}

int minGroupSize = clusterOptions.getMinGroupSize();
Expand All @@ -71,17 +73,17 @@ public List<PrismObject<RoleAnalysisClusterType>> executeClustering(ClusterOptio
}

private ListMultimap<List<String>, String> loadData(OperationResult result, @NotNull PageBase pageBase,
int threshold, int maxProperties, ObjectFilter roleQuery) {
int minProperties, int maxProperties, ObjectFilter userQuery) {

//role //user
ListMultimap<String, String> userTypeMap = ArrayListMultimap.create();
ListMultimap<String, String> roleToUserMap = ArrayListMultimap.create();

ResultHandler<UserType> resultHandler = (object, parentResult) -> {
try {
UserType user = object.asObjectable();
List<String> element = ClusterObjectUtils.getRolesOid(user);
for (String roleId : element) {
userTypeMap.putAll(roleId, Collections.singletonList(user.getOid()));
UserType properties = object.asObjectable();
List<String> members = ClusterObjectUtils.getRolesOid(properties);
for (String roleId : members) {
roleToUserMap.putAll(roleId, Collections.singletonList(properties.getOid()));
}
} catch (Exception e) {
throw new RuntimeException(e);
Expand All @@ -91,7 +93,7 @@ private ListMultimap<List<String>, String> loadData(OperationResult result, @Not

GetOperationOptionsBuilder optionsBuilder = pageBase.getSchemaService().getOperationOptionsBuilder();
RepositoryService repositoryService = pageBase.getRepositoryService();
ObjectQuery objectQuery = pageBase.getPrismContext().queryFactory().createQuery(roleQuery);
ObjectQuery objectQuery = pageBase.getPrismContext().queryFactory().createQuery(userQuery);

try {
repositoryService.searchObjectsIterative(UserType.class, objectQuery, resultHandler, optionsBuilder.build(),
Expand All @@ -101,16 +103,16 @@ private ListMultimap<List<String>, String> loadData(OperationResult result, @Not
}

//user //role
ListMultimap<List<String>, String> flippedMap = ArrayListMultimap.create();
for (String key : userTypeMap.keySet()) {
List<String> values = userTypeMap.get(key);
int propertiesCount = values.size();
if (threshold <= propertiesCount && maxProperties >= propertiesCount) {
flippedMap.put(values, key);
ListMultimap<List<String>, String> userToRoleMap = ArrayListMultimap.create();
for (String member : roleToUserMap.keySet()) {
List<String> properties = roleToUserMap.get(member);
int propertiesCount = properties.size();
if (minProperties <= propertiesCount && maxProperties >= propertiesCount) {
userToRoleMap.put(properties, member);
}
}

return flippedMap;
return userToRoleMap;
}

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

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

import static com.evolveum.midpoint.gui.impl.page.admin.role.mining.tables.Tools.endTimer;
import static com.evolveum.midpoint.gui.impl.page.admin.role.mining.tables.Tools.startTimer;
import static com.evolveum.midpoint.gui.impl.page.admin.role.mining.utils.Tools.endTimer;
import static com.evolveum.midpoint.gui.impl.page.admin.role.mining.utils.Tools.startTimer;

import java.util.Collections;
import java.util.List;

import com.evolveum.midpoint.gui.impl.page.admin.role.mining.algorithm.object.ClusterOptions;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.algorithm.object.DataPoint;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.algorithm.utils.ClusterAlgorithmUtils;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleAnalysisClusterType;

import com.google.common.collect.ArrayListMultimap;
Expand All @@ -35,8 +38,6 @@

public class UserBasedClustering implements Clusterable {

OperationResult operationResult = new OperationResult("Map UserType object for clustering");

@Override
public List<PrismObject<RoleAnalysisClusterType>> executeClustering(ClusterOptions clusterOptions) {

Expand All @@ -50,6 +51,7 @@ public List<PrismObject<RoleAnalysisClusterType>> executeClustering(ClusterOptio

PageBase pageBase = clusterOptions.getPageBase();
//roles //users
OperationResult operationResult = new OperationResult("ExecuteUserBasedClustering");
ListMultimap<List<String>, String> chunkMap = loadData(operationResult, pageBase,
threshold, maxProperties, clusterOptions.getQuery());
List<DataPoint> dataPoints = ClusterAlgorithmUtils.prepareDataPoints(chunkMap);
Expand All @@ -60,7 +62,7 @@ public List<PrismObject<RoleAnalysisClusterType>> executeClustering(ClusterOptio

//TODO
if (eps == 0.0) {
return new ClusterAlgorithmUtils().processIdenticalGroup(pageBase, dataPoints, clusterOptions);
return new ClusterAlgorithmUtils().processExactMatch(pageBase, dataPoints, clusterOptions);
}
start = startTimer("clustering");
DistanceMeasure distanceMeasure = new JaccardDistancesMeasure(minIntersections);
Expand All @@ -72,18 +74,18 @@ public List<PrismObject<RoleAnalysisClusterType>> executeClustering(ClusterOptio
}

private ListMultimap<List<String>, String> loadData(OperationResult result, PageBase pageBase,
int threshold, int maxProperties, ObjectFilter userQuery) {
int minProperties, int maxProperties, ObjectFilter userQuery) {

//role //user
ListMultimap<List<String>, String> userTypeMap = ArrayListMultimap.create();
ListMultimap<List<String>, String> roleToUserMap = ArrayListMultimap.create();

ResultHandler<UserType> resultHandler = (object, parentResult) -> {
try {
List<String> element = ClusterObjectUtils.getRolesOid(object.asObjectable());
int propertiesCount = element.size();
if (threshold <= propertiesCount && maxProperties >= propertiesCount) {
Collections.sort(element);
userTypeMap.putAll(element, Collections.singletonList(object.asObjectable().getOid()));
List<String> members = ClusterObjectUtils.getRolesOid(object.asObjectable());
int propertiesCount = members.size();
if (minProperties <= propertiesCount && maxProperties >= propertiesCount) {
Collections.sort(members);
roleToUserMap.putAll(members, Collections.singletonList(object.asObjectable().getOid()));
}
} catch (Exception e) {
throw new RuntimeException(e);
Expand All @@ -102,6 +104,6 @@ private ListMultimap<List<String>, String> loadData(OperationResult result, Page
throw new RuntimeException(e);
}

return userTypeMap;
return roleToUserMap;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* and European Union Public License. See LICENSE file for details.
*/

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

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

Expand All @@ -20,21 +20,18 @@ public class DetectedPattern implements Serializable {

Set<String> properties;
Set<String> members;
Integer clusterRelatedPropertiesOccupation;
Integer allPropertiesOccupation;
Set<String> memberTypeObjectOccupation;
Double clusterMetric;
RoleAnalysisSearchModeType searchMode;

public DetectedPattern(Set<String> properties, Set<String> members,
double clusterMetric,
Integer clusterRelatedPropertiesOccupation,
Integer allPropertiesOccupation,
Set<String> memberTypeObjectOccupation,
RoleAnalysisSearchModeType searchMode) {
this.properties = properties;
this.members = members;
this.clusterMetric = clusterMetric;
this.clusterRelatedPropertiesOccupation = clusterRelatedPropertiesOccupation;
this.allPropertiesOccupation = allPropertiesOccupation;
this.memberTypeObjectOccupation = memberTypeObjectOccupation;
this.searchMode = searchMode;
}

Expand All @@ -50,15 +47,15 @@ public double getClusterMetric() {
return clusterMetric;
}

public int getClusterRelatedPropertiesOccupation() {
return clusterRelatedPropertiesOccupation;
public RoleAnalysisSearchModeType getSearchMode() {
return searchMode;
}

public Integer getAllPropertiesOccupation() {
return allPropertiesOccupation;
public Set<String> getMemberTypeObjectOccupation() {
return memberTypeObjectOccupation;
}

public RoleAnalysisSearchModeType getSearchMode() {
return searchMode;
public void setMemberTypeObjectOccupation(Set<String> memberTypeObjectOccupation) {
this.memberTypeObjectOccupation = memberTypeObjectOccupation;
}
}

0 comments on commit 38eecc1

Please sign in to comment.