Skip to content

Commit

Permalink
Improve attribute analysis role-mining
Browse files Browse the repository at this point in the history
1. Implement new selector for attribute analysis
2. Change on schema level
  • Loading branch information
tchrapovic committed Apr 18, 2024
1 parent 1535d25 commit a8440fe
Show file tree
Hide file tree
Showing 37 changed files with 1,824 additions and 970 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,7 @@ public void onClick(AjaxRequestTarget target) {
clearCache();
refreshTable(target);

target.add(getTable());
target.add(getTableComponent());
}
};
refreshIcon.add(AttributeAppender.append("class", "btn btn-default btn-sm"));
Expand All @@ -408,7 +408,7 @@ public void onClick(AjaxRequestTarget target) {
private void onClickPlayPauseButton(AjaxRequestTarget target, boolean refreshEnabled) {
clearCache();
setManualRefreshEnabled(refreshEnabled);
target.add(getTable());
target.add(getTableComponent());
}

public void startRefreshing(AjaxRequestTarget target) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -561,7 +561,16 @@ protected boolean isNewObjectButtonEnabled() {

public BoxedTablePanel<PO> getTable() {
//noinspection unchecked
return (BoxedTablePanel<PO>) get(ID_ITEMS_TABLE);
return (BoxedTablePanel<PO>) getTableComponent();
}

private RoleAnalysisCollapsableTablePanel<PO> getCollapsableTable() {
//noinspection unchecked
return (RoleAnalysisCollapsableTablePanel<PO>) getTableComponent();
}

public Component getTableComponent() {
return get(ID_ITEMS_TABLE);
}

public Class<C> getType() {
Expand Down Expand Up @@ -905,6 +914,13 @@ protected CsvDownloadButtonPanel createDownloadButton(String buttonId) {
CsvDownloadButtonPanel exportDataLink = new CsvDownloadButtonPanel(buttonId) {
@Override
protected DataTable<?, ?> getDataTable() {
Component tableComponent = getTableComponent();
if (tableComponent instanceof BoxedTablePanel) {
return getTable().getDataTable();
} else if (tableComponent instanceof RoleAnalysisCollapsableTablePanel) {
return getCollapsableTable().getDataTable();
}

return getTable().getDataTable();
}

Expand Down Expand Up @@ -1083,18 +1099,23 @@ private CompiledObjectCollectionView getCollectionViewForAllObject() {
}

protected ISelectableDataProvider getDataProvider() {
BoxedTablePanel<PO> table = getTable();
return (ISelectableDataProvider) table.getDataTable().getDataProvider();
Component tableComponent = getTableComponent();
if (tableComponent instanceof BoxedTablePanel) {
return (ISelectableDataProvider) getTable().getDataTable().getDataProvider();
} else if (tableComponent instanceof RoleAnalysisCollapsableTablePanel) {
return (ISelectableDataProvider) getCollapsableTable().getDataTable().getDataProvider();
}
return null;
}

public void refreshTable(AjaxRequestTarget target) {
BoxedTablePanel<PO> table = getTable();
if (searchModel.getObject().isForceReload()) {
resetTable(target);
} else {
saveSearchModel(getCurrentTablePaging());
}
target.add(table);

target.add(getTableComponent());
target.add(getFeedbackPanel());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,28 +6,26 @@
*/
package com.evolveum.midpoint.gui.impl.factory.panel.mining;

import java.io.Serializable;

import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismPropertyWrapper;
import com.evolveum.midpoint.gui.impl.factory.panel.AbstractInputGuiComponentFactory;
import com.evolveum.midpoint.gui.impl.factory.panel.PrismPropertyPanelContext;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.components.AttributeIdentifierDropDownPanel;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.page.panel.session.AnalysisAttributeSelectorPanel;

import jakarta.annotation.PostConstruct;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Component;

import com.evolveum.midpoint.gui.api.prism.wrapper.ItemWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismPropertyWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismValueWrapper;
import com.evolveum.midpoint.gui.impl.factory.panel.AbstractInputGuiComponentFactory;
import com.evolveum.midpoint.gui.impl.factory.panel.PrismPropertyPanelContext;
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.*;

//TODO check serializable
@Component
public class AttributeIdentifierPanelFactory extends AbstractInputGuiComponentFactory<String> implements Serializable {
public class AnalysisAttributeFactory extends AbstractInputGuiComponentFactory<ClusteringAttributeSettingType> {

@PostConstruct
public void register() {
Expand All @@ -36,31 +34,41 @@ public void register() {

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

@Override
protected InputPanel getPanel(PrismPropertyPanelContext<ClusteringAttributeSettingType> panelCtx) {
AnalysisAttributeSelectorPanel clusteringAttributeSelectorPanel = new AnalysisAttributeSelectorPanel(panelCtx.getComponentId(),
new PropertyModel<>(panelCtx.getItemWrapperModel(), "value"), getProcessMode(panelCtx));
clusteringAttributeSelectorPanel.setOutputMarkupId(true);
return clusteringAttributeSelectorPanel;
}

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

@Override
protected InputPanel getPanel(PrismPropertyPanelContext<String> panelCtx) {
RoleAnalysisProcessModeType processMode = getProcessMode(panelCtx);
AttributeIdentifierDropDownPanel rangeSliderPanel = new AttributeIdentifierDropDownPanel(
panelCtx.getComponentId(), panelCtx.getRealValueModel(), processMode, getContainer(panelCtx));
rangeSliderPanel.getBaseFormComponent().add(new EmptyOnChangeAjaxFormUpdatingBehavior());
rangeSliderPanel.setOutputMarkupId(true);
return rangeSliderPanel;
public void configure(PrismPropertyPanelContext<ClusteringAttributeSettingType> panelCtx, org.apache.wicket.Component
component) {
component.setEnabled(panelCtx.getVisibleEnableBehavior().isEnabled());
}

public RoleAnalysisProcessModeType getProcessMode(@NotNull PrismPropertyPanelContext<String> panelCtx) {
IModel<PrismPropertyWrapper<String>> itemWrapperModel = panelCtx.getItemWrapperModel();
public RoleAnalysisProcessModeType getProcessMode
(@NotNull PrismPropertyPanelContext<ClusteringAttributeSettingType> panelCtx) {
IModel<PrismPropertyWrapper<ClusteringAttributeSettingType>> itemWrapperModel = panelCtx.getItemWrapperModel();

if (itemWrapperModel != null) {
PrismPropertyWrapper<String> object = itemWrapperModel.getObject();
PrismPropertyWrapper<ClusteringAttributeSettingType> object = itemWrapperModel.getObject();
if (object != null) {
PrismContainerValueWrapper<?> parent = object.getParent();
if (parent != null) {
if (parent.getParent() != null) {
if (parent.getParent().getParent() != null) {
Object realValue = parent.getParent().getParent().getRealValue();
if (realValue != null && realValue instanceof RoleAnalysisSessionType session) {
if (realValue instanceof RoleAnalysisSessionType session) {
RoleAnalysisOptionType analysisOption = session.getAnalysisOption();
return analysisOption.getProcessMode();
}
Expand All @@ -72,15 +80,4 @@ public RoleAnalysisProcessModeType getProcessMode(@NotNull PrismPropertyPanelCon

return RoleAnalysisProcessModeType.USER;
}

public PrismContainerValueWrapper<?> getContainer(@NotNull PrismPropertyPanelContext<String> panelCtx) {
IModel<PrismPropertyWrapper<String>> itemWrapperModel = panelCtx.getItemWrapperModel();
return itemWrapperModel.getObject().getParent();
}

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

}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
/*
* Copyright (C) 2010-2024 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.mining;

import com.evolveum.midpoint.gui.api.prism.wrapper.ItemWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismPropertyWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismValueWrapper;
import com.evolveum.midpoint.gui.impl.factory.panel.AbstractInputGuiComponentFactory;
import com.evolveum.midpoint.gui.impl.factory.panel.PrismPropertyPanelContext;
import com.evolveum.midpoint.gui.impl.page.admin.role.mining.page.panel.session.ClusteringAttributeSelectorPanel;
import com.evolveum.midpoint.web.component.prism.InputPanel;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import jakarta.annotation.PostConstruct;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Component;

@Component
public class ClusteringAttributeFactory extends AbstractInputGuiComponentFactory<ClusteringAttributeSettingType> {

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

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

@Override
protected InputPanel getPanel(PrismPropertyPanelContext<ClusteringAttributeSettingType> panelCtx) {
ClusteringAttributeSelectorPanel clusteringAttributeSelectorPanel = new ClusteringAttributeSelectorPanel(panelCtx.getComponentId(),
new PropertyModel<>(panelCtx.getItemWrapperModel(), "value"), getProcessMode(panelCtx));
clusteringAttributeSelectorPanel.setOutputMarkupId(true);
return clusteringAttributeSelectorPanel;
}

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

@Override
public void configure(PrismPropertyPanelContext<ClusteringAttributeSettingType> panelCtx, org.apache.wicket.Component
component) {
component.setEnabled(panelCtx.getVisibleEnableBehavior().isEnabled());
}

public RoleAnalysisProcessModeType getProcessMode
(@NotNull PrismPropertyPanelContext<ClusteringAttributeSettingType> panelCtx) {
IModel<PrismPropertyWrapper<ClusteringAttributeSettingType>> itemWrapperModel = panelCtx.getItemWrapperModel();

if (itemWrapperModel != null) {
PrismPropertyWrapper<ClusteringAttributeSettingType> object = itemWrapperModel.getObject();
if (object != null) {
PrismContainerValueWrapper<?> parent = object.getParent();
if (parent != null) {
if (parent.getParent() != null) {
if (parent.getParent().getParent() != null) {
Object realValue = parent.getParent().getParent().getRealValue();
if (realValue instanceof RoleAnalysisSessionType session) {
RoleAnalysisOptionType analysisOption = session.getAnalysisOption();
return analysisOption.getProcessMode();
}
}
}
}
}
}

return RoleAnalysisProcessModeType.USER;
}
}

0 comments on commit a8440fe

Please sign in to comment.