Skip to content

Commit

Permalink
Add base implementation of analysis mods functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
tchrapovic committed Apr 26, 2024
1 parent 1cde4e2 commit 8056611
Show file tree
Hide file tree
Showing 14 changed files with 528 additions and 142 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,56 @@
package com.evolveum.midpoint.gui.impl.page.admin.role.mining.page.tmp.context;

import com.evolveum.midpoint.gui.api.prism.wrapper.ItemVisibilityHandler;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractAnalysisSessionOptionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleAnalysisDetectionOptionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleAnalysisProcessModeType;
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.PrismObjectWrapper;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.jetbrains.annotations.NotNull;

public abstract class AbstractAnalysisOption {

RoleAnalysisProcessModeType processMode;
AbstractAnalysisSessionOptionType analysisSessionOption;
RoleAnalysisDetectionOptionType detectionOption;
ItemVisibilityHandler visibilityHandler;
PrismObjectWrapper<RoleAnalysisSessionType> objectWrapper;

public AbstractAnalysisOption(@NotNull PrismObjectWrapper<RoleAnalysisSessionType> objectWrapper) {
this.objectWrapper = objectWrapper;
PrismObject<RoleAnalysisSessionType> object = objectWrapper.getObject();
RoleAnalysisSessionType realValue = object.getRealValue();
RoleAnalysisOptionType analysisOption = realValue.getAnalysisOption();
this.processMode = analysisOption.getProcessMode();

if (processMode.equals(RoleAnalysisProcessModeType.ROLE)) {
this.analysisSessionOption = realValue.getRoleModeOptions();
} else {
this.analysisSessionOption = realValue.getUserModeOptions();
}

this.detectionOption = realValue.getDefaultDetectionOption();
}

public void applySettings() {
PrismObjectWrapper<RoleAnalysisSessionType> objectWrapper = getObjectWrapper();
AbstractAnalysisSessionOptionType analysisSessionOption = getAnalysisSessionOption();
RoleAnalysisProcessModeType processMode = getProcessMode();


RoleAnalysisSessionType realValue = objectWrapper.getObject().getRealValue();
realValue.getAnalysisOption().setAnalysisCategory(RoleAnalysisCategoryType.OUTLIERS);
if (processMode.equals(RoleAnalysisProcessModeType.ROLE)) {
realValue.setRoleModeOptions((RoleAnalysisSessionOptionType) analysisSessionOption);
} else {
realValue.setUserModeOptions((UserAnalysisSessionOptionType) analysisSessionOption);
}

realValue.setDefaultDetectionOption(getDetectionOption());
}

public RoleAnalysisProcessModeType getProcessMode() {
return processMode;
Expand Down Expand Up @@ -51,4 +91,36 @@ public void setVisibilityHandler(ItemVisibilityHandler visibilityHandler) {
this.visibilityHandler = visibilityHandler;
}

public PrismObjectWrapper<RoleAnalysisSessionType> getObjectWrapper() {
return objectWrapper;
}

public void setObjectWrapper(PrismObjectWrapper<RoleAnalysisSessionType> objectWrapper) {
this.objectWrapper = objectWrapper;
}

protected PrismContainerValueWrapper<Containerable> getPrimaryOptionContainer(
@NotNull PrismObjectWrapper<RoleAnalysisSessionType> objectWrapper) {
RoleAnalysisProcessModeType processMode = getProcessMode();
try {
if (processMode.equals(RoleAnalysisProcessModeType.ROLE)) {
return objectWrapper.findContainerValue(RoleAnalysisSessionType.F_ROLE_MODE_OPTIONS);
} else {
return objectWrapper.findContainerValue(RoleAnalysisSessionType.F_USER_MODE_OPTIONS);
}
} catch (SchemaException e) {
throw new IllegalStateException("Couldn't find container form RoleAnalysisSessionType model for process mode: "
+ processMode, e);
}
}

protected PrismContainerWrapper<RoleAnalysisDetectionOptionType> getDetectionOptionContainer(
@NotNull PrismObjectWrapper<RoleAnalysisSessionType> objectWrapper) {
try {
return objectWrapper.findContainer(RoleAnalysisSessionType.F_DEFAULT_DETECTION_OPTION);
} catch (SchemaException e) {
throw new IllegalStateException("Couldn't find container form RoleAnalysisSessionType model for detection options",
e);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,15 @@
package com.evolveum.midpoint.gui.impl.page.admin.role.mining.page.tmp.context;

import com.evolveum.midpoint.gui.api.component.wizard.TileEnum;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismObjectWrapper;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.page.tmp.modes.*;
import com.evolveum.midpoint.model.api.mining.RoleAnalysisService;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleAnalysisCategoryType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleAnalysisSessionType;

import org.jetbrains.annotations.NotNull;

public enum AnalysisCategory implements TileEnum {

Expand All @@ -34,15 +39,30 @@ public String getIcon() {
return iconClass;
}

public AbstractAnalysisOption generateConfiguration(RoleAnalysisService service, Task task, OperationResult result) {
public AbstractAnalysisOption generateConfiguration(
@NotNull RoleAnalysisService service,
@NotNull PrismObjectWrapper<RoleAnalysisSessionType> objectWrapper,
@NotNull Task task,
@NotNull OperationResult result) {
return switch (this) {
case STANDARD -> new StandardModeConfiguration(service, objectWrapper, task, result);
case BALANCED_COVERAGE -> new BalancedCoverageModeConfiguration(service, objectWrapper, task, result);
case EXACT_ACCESS_SIMILARITY -> new ExactSimilarityModeConfiguration(service, objectWrapper, task, result);
case EXPLORATORY -> new ExploratoryModeConfiguration(service, objectWrapper, task, result);
case MINIMAL -> new MinimalConditionModeConfiguration(service, objectWrapper, task, result);
case ADVANCED -> new AdvancedModeConfiguration(service, objectWrapper, task, result);
case OUTLIER -> new OutlierModeConfiguration(service, objectWrapper, task, result);
};
}

public RoleAnalysisCategoryType resolveCategoryMode() {
return switch (this) {
case STANDARD -> new StandardModeConfiguration(service, task, result);
case BALANCED_COVERAGE -> new BalancedCoverageModeConfiguration(service, task, result);
case EXACT_ACCESS_SIMILARITY -> new ExactSimilarityModeConfiguration(service, task, result);
case EXPLORATORY -> new ExploratoryModeConfiguration(service, task, result);
case MINIMAL -> new MinimalConditionModeConfiguration(service, task, result);
case ADVANCED -> new AdvancedModeConfiguration(service, task, result);
case OUTLIER -> new OutlierModeConfiguration(service, task, result);
case STANDARD, MINIMAL -> RoleAnalysisCategoryType.STANDARD;
case BALANCED_COVERAGE -> RoleAnalysisCategoryType.BALANCED;
case EXACT_ACCESS_SIMILARITY -> RoleAnalysisCategoryType.EXACT;
case EXPLORATORY -> RoleAnalysisCategoryType.EXPLORATION;
case ADVANCED -> RoleAnalysisCategoryType.ADVANCED;
case OUTLIER -> RoleAnalysisCategoryType.OUTLIERS;
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,42 +8,77 @@
package com.evolveum.midpoint.gui.impl.page.admin.role.mining.page.tmp.modes;

import com.evolveum.midpoint.gui.api.prism.wrapper.ItemVisibilityHandler;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismObjectWrapper;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.page.tmp.context.AbstractAnalysisOption;
import com.evolveum.midpoint.model.api.mining.RoleAnalysisService;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractAnalysisSessionOptionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleAnalysisDetectionOptionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.jetbrains.annotations.NotNull;

public class AdvancedModeConfiguration extends AbstractAnalysisOption {

RoleAnalysisService service;
Task task;
OperationResult result;
PrismObjectWrapper<RoleAnalysisSessionType> objectWrapper;

public AdvancedModeConfiguration(RoleAnalysisService service, Task task, OperationResult result) {
public AdvancedModeConfiguration(
RoleAnalysisService service,
PrismObjectWrapper<RoleAnalysisSessionType> objectWrapper,
Task task,
OperationResult result) {
super(objectWrapper);
this.service = service;
this.task = task;
this.result = result;
this.objectWrapper = objectWrapper;
}

public AdvancedModeConfiguration() {
super();
}


@Override
public void setAnalysisSessionOption(AbstractAnalysisSessionOptionType analysisSessionOption) {
super.setAnalysisSessionOption(analysisSessionOption);
public AbstractAnalysisSessionOptionType getAnalysisSessionOption() {
AbstractAnalysisSessionOptionType analysisSessionOption = new AbstractAnalysisSessionOptionType();
analysisSessionOption.setSimilarityThreshold(100.0);
analysisSessionOption.setIsIndirect(false);
analysisSessionOption.setMinMembersCount(2);
analysisSessionOption.setMinPropertiesOverlap(1);
analysisSessionOption.setPropertiesRange(new RangeType()
.min(1.0)
.max(Double.valueOf(getMaxPropertyCount())));
return analysisSessionOption;
}

@Override
public void setDetectionOption(RoleAnalysisDetectionOptionType detectionOption) {
super.setDetectionOption(detectionOption);
public RoleAnalysisDetectionOptionType getDetectionOption() {
return super.getDetectionOption();
}

@Override
public void setVisibilityHandler(ItemVisibilityHandler visibilityHandler) {
super.setVisibilityHandler(visibilityHandler);
public ItemVisibilityHandler getVisibilityHandler() {
return super.getVisibilityHandler();
}

public @NotNull Integer getMaxPropertyCount() {
Class<? extends ObjectType> propertiesClass = UserType.class;
if (getProcessMode().equals(RoleAnalysisProcessModeType.USER)) {
propertiesClass = RoleType.class;
}

Integer maxPropertiesObjects;

maxPropertiesObjects = service.countObjects(propertiesClass, null, null, task, result);

if (maxPropertiesObjects == null) {
maxPropertiesObjects = 1000000;
}
return maxPropertiesObjects;
}

public @NotNull Integer getMinPropertyCount(Integer maxPropertiesObjects) {
return maxPropertiesObjects < 10 ? 1 : 10;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,42 +8,75 @@
package com.evolveum.midpoint.gui.impl.page.admin.role.mining.page.tmp.modes;

import com.evolveum.midpoint.gui.api.prism.wrapper.ItemVisibilityHandler;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismObjectWrapper;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.page.tmp.context.AbstractAnalysisOption;
import com.evolveum.midpoint.model.api.mining.RoleAnalysisService;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractAnalysisSessionOptionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleAnalysisDetectionOptionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.jetbrains.annotations.NotNull;

public class BalancedCoverageModeConfiguration extends AbstractAnalysisOption {

RoleAnalysisService service;
Task task;
OperationResult result;
PrismObjectWrapper<RoleAnalysisSessionType> objectWrapper;

public BalancedCoverageModeConfiguration(RoleAnalysisService service, Task task, OperationResult result) {
public BalancedCoverageModeConfiguration(
RoleAnalysisService service,
PrismObjectWrapper<RoleAnalysisSessionType> objectWrapper,
Task task,
OperationResult result) {
super(objectWrapper);
this.service = service;
this.task = task;
this.result = result;
this.objectWrapper = objectWrapper;
}

public BalancedCoverageModeConfiguration() {
super();
}

@Override
public void setAnalysisSessionOption(AbstractAnalysisSessionOptionType analysisSessionOption) {
super.setAnalysisSessionOption(analysisSessionOption);
public AbstractAnalysisSessionOptionType getAnalysisSessionOption() {
AbstractAnalysisSessionOptionType analysisSessionOption = super.getAnalysisSessionOption();
analysisSessionOption.setSimilarityThreshold(80.0);
analysisSessionOption.setIsIndirect(false);
analysisSessionOption.setMinMembersCount(2);
analysisSessionOption.setMinPropertiesOverlap(1);
analysisSessionOption.setPropertiesRange(new RangeType()
.min(1.0)
.max(Double.valueOf(getMaxPropertyCount())));
return analysisSessionOption;
}

@Override
public void setDetectionOption(RoleAnalysisDetectionOptionType detectionOption) {
super.setDetectionOption(detectionOption);
public RoleAnalysisDetectionOptionType getDetectionOption() {
return super.getDetectionOption();
}

@Override
public void setVisibilityHandler(ItemVisibilityHandler visibilityHandler) {
super.setVisibilityHandler(visibilityHandler);
public ItemVisibilityHandler getVisibilityHandler() {
return super.getVisibilityHandler();
}

public @NotNull Integer getMaxPropertyCount() {
Class<? extends ObjectType> propertiesClass = UserType.class;
if (getProcessMode().equals(RoleAnalysisProcessModeType.USER)) {
propertiesClass = RoleType.class;
}

Integer maxPropertiesObjects;

maxPropertiesObjects = service.countObjects(propertiesClass, null, null, task, result);

if (maxPropertiesObjects == null) {
maxPropertiesObjects = 1000000;
}
return maxPropertiesObjects;
}

public @NotNull Integer getMinPropertyCount(Integer maxPropertiesObjects) {
return maxPropertiesObjects < 10 ? 1 : 10;
}
}

0 comments on commit 8056611

Please sign in to comment.