From 29fa771ec779262a401519897c67c3fc52419113 Mon Sep 17 00:00:00 2001 From: honchar Date: Mon, 17 Oct 2016 20:37:44 +0200 Subject: [PATCH] Merge Objects gui implementing --- .../page/admin/users/PageMergeObjects.java | 27 ++- .../users/component/MergeObjectsPanel.html | 39 +-- .../users/component/MergeObjectsPanel.java | 222 +++++++++++++++++- .../localization/Midpoint.properties | 12 + .../security/api/AuthorizationConstants.java | 3 + 5 files changed, 277 insertions(+), 26 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageMergeObjects.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageMergeObjects.java index d02b8ab2b89..604568545da 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageMergeObjects.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageMergeObjects.java @@ -16,8 +16,15 @@ package com.evolveum.midpoint.web.page.admin.users; import com.evolveum.midpoint.gui.api.page.PageBase; +import com.evolveum.midpoint.security.api.AuthorizationConstants; +import com.evolveum.midpoint.web.application.AuthorizationAction; +import com.evolveum.midpoint.web.application.PageDescriptor; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; +import com.evolveum.midpoint.web.page.admin.PageAdmin; +import com.evolveum.midpoint.web.page.admin.PageAdminFocus; +import com.evolveum.midpoint.web.page.admin.PageAdminObjectDetails; import com.evolveum.midpoint.web.page.admin.users.component.MergeObjectsPanel; +import com.evolveum.midpoint.web.util.OnePageParameterEncoder; import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import org.apache.commons.lang3.StringUtils; @@ -26,7 +33,17 @@ /** * Created by honchar. */ -public class PageMergeObjects extends PageBase { +@PageDescriptor(url = "/admin/mergeObjects", encoder = OnePageParameterEncoder.class, action = { + @AuthorizationAction(actionUri = PageAdminUsers.AUTH_USERS_ALL, + label = PageAdminUsers.AUTH_USERS_ALL_LABEL, + description = PageAdminUsers.AUTH_USERS_ALL_DESCRIPTION), + @AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_UI_USER_URL, + label = "PageUser.auth.user.label", + description = "PageUser.auth.user.description"), + @AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_UI_MERGE_OBJECTS_URL, + label = "PageMergeObjects.auth.mergeObjects.label", + description = "PageMergeObjects.auth.mergeObjects.description") }) +public class PageMergeObjects extends PageAdmin { private static final String ID_MERGE_PANEL = "mergePanel"; private F mergeObject; private F mergeWithObject; @@ -41,16 +58,20 @@ public PageMergeObjects(F mergeObject, F mergeWithObject, Class type){ initLayout(); } - private void initLayout(){ + protected void initLayout(){ if (mergeObject == null || StringUtils.isEmpty(mergeObject.getOid()) || mergeWithObject == null || StringUtils.isEmpty(mergeWithObject.getOid())) { Label warningMessage = new Label(ID_MERGE_PANEL, createStringResource("PageMergeObjects.warningMessage")); warningMessage.setOutputMarkupId(true); add(warningMessage); } else { - MergeObjectsPanel mergePanel = new MergeObjectsPanel(ID_MERGE_PANEL, mergeObject, mergeWithObject, type); + MergeObjectsPanel mergePanel = new MergeObjectsPanel(ID_MERGE_PANEL, mergeObject, mergeWithObject, type, PageMergeObjects.this); mergePanel.setOutputMarkupId(true); add(mergePanel); } } + + protected F createNewObject(){ + return null; + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/MergeObjectsPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/MergeObjectsPanel.html index 56a17addf7e..8253d739df0 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/MergeObjectsPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/MergeObjectsPanel.html @@ -16,32 +16,35 @@ --> - +
- - - +
+ +
+
+
+
-
+
- +
-
-
+
- +
- +
- - - - - - - - + + diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/MergeObjectsPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/MergeObjectsPanel.java index d0594eb370e..3b45f6d9d62 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/MergeObjectsPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/MergeObjectsPanel.java @@ -16,46 +16,258 @@ package com.evolveum.midpoint.web.page.admin.users.component; import com.evolveum.midpoint.gui.api.component.BasePanel; +import com.evolveum.midpoint.gui.api.page.PageBase; +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.util.exception.*; +import com.evolveum.midpoint.util.logging.LoggingUtils; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.web.component.AjaxButton; +import com.evolveum.midpoint.web.component.AjaxSubmitButton; +import com.evolveum.midpoint.web.component.form.Form; +import com.evolveum.midpoint.web.component.input.DropDownChoicePanel; import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.MergeConfigurationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemObjectsType; +import org.apache.wicket.Component; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.model.IModel; + +import java.util.ArrayList; +import java.util.List; /** * Created by honchar. */ public class MergeObjectsPanel extends BasePanel{ + private static final Trace LOGGER = TraceManager.getTrace(MergeObjectsPanel.class); + private static final String DOT_CLASS = MergeObjectsPanel.class.getName() + "."; + private static final String OPERATION_GET_MERGE_OBJECT_PREVIEW = DOT_CLASS + "getMergeObjectPreview"; + private static final String OPERATION_LOAD_MERGE_TYPE_NAMES = DOT_CLASS + "loadMergeTypeNames"; + + private static final String ID_MERGE_OBJECT_DETAILS_PANEL = "mergeObjectDetailsPanel"; private static final String ID_MERGE_WITH_OBJECT_DETAILS_PANEL = "mergeWithObjectDetailsPanel"; private static final String ID_MERGE_RESULT_OBJECT_DETAILS_PANEL = "mergeResultObjectDetailsPanel"; - private static final String ID_PLUS_ICON = "mergeObjectDetailsPanel"; - private static final String ID_EQUAL_ICON = "mergeObjectDetailsPanel"; + private static final String ID_BACK_BUTTON = "back"; + private static final String ID_SWITCH_DIRECTION_BUTTON = "switchDirection"; + private static final String ID_MERGE_DELTA_PREVIEW_BUTTON = "mergeDeltaPreview"; + private static final String ID_MERGE_BUTTON = "merge"; + private static final String ID_FORM = "mainForm"; + private static final String ID_MERGE_TYPE_SELECTOR = "mergeType"; private F mergeObject; private F mergeWithObject; private Class type; + private PageBase pageBase; + private IModel mergeTypeModel; + private String currentMergeType = ""; + private IModel> mergeTypeChoicesModel; + private List mergeTypeChoices; public MergeObjectsPanel(String id){ super(id); } - public MergeObjectsPanel(String id, F mergeObject, F mergeWithObject, Class type){ + public MergeObjectsPanel(String id, F mergeObject, F mergeWithObject, Class type, PageBase pageBase){ super(id); this.mergeObject = mergeObject; this.mergeWithObject = mergeWithObject; this.type = type; + this.pageBase = pageBase; + mergeTypeChoices = getMergeTypeNames(); + + initModels(); initLayout(); } + private void initModels(){ + mergeTypeModel = new IModel() { + @Override + public String getObject() { + return currentMergeType; + } + + @Override + public void setObject(String mergeType) { + currentMergeType = mergeType; + } + + @Override + public void detach() { + + } + }; + + mergeTypeChoicesModel = new IModel>() { + @Override + public List getObject() { + return mergeTypeChoices; + } + + @Override + public void setObject(List strings) { + + } + + @Override + public void detach() { + + } + }; + } + private void initLayout(){ + Form mainForm = new Form(ID_FORM); + mainForm.setOutputMarkupId(true); + add(mainForm); + + DropDownChoicePanel mergeTypeSelect = new DropDownChoicePanel(ID_MERGE_TYPE_SELECTOR, + mergeTypeModel, mergeTypeChoicesModel); + +// WebComponentUtil.createEnumPanel(MergeType.class, +// ID_MERGE_TYPE_SELECTOR, mergeTypeModel, this); +// mergeTypeSelect.add(new OnChangeAjaxBehavior() { +// +// @Override +// protected void onUpdate(AjaxRequestTarget target) { +//// AssignmentCatalogPanel parentPanel = CatalogItemsPanel.this.findParent(AssignmentCatalogPanel.class); +//// parentPanel.addOrReplaceLayout(); +//// target.add(parentPanel); +// } +// }); + mergeTypeSelect.setOutputMarkupId(true); + mainForm.add(mergeTypeSelect); + MergeObjectDetailsPanel mergeObjectPanel = new MergeObjectDetailsPanel(ID_MERGE_OBJECT_DETAILS_PANEL, mergeObject, type); mergeObjectPanel.setOutputMarkupId(true); - add(mergeObjectPanel); + mainForm.add(mergeObjectPanel); MergeObjectDetailsPanel mergeWithObjectPanel = new MergeObjectDetailsPanel(ID_MERGE_WITH_OBJECT_DETAILS_PANEL, mergeWithObject, type); mergeWithObjectPanel.setOutputMarkupId(true); - add(mergeWithObjectPanel); + mainForm.add(mergeWithObjectPanel); + PrismObject mergeResultObject = getMergeObjectsResult(); + Component mergeObjectsResultPanel; + if (mergeResultObject != null) { + mergeObjectsResultPanel = new MergeObjectDetailsPanel(ID_MERGE_RESULT_OBJECT_DETAILS_PANEL, + mergeResultObject.asObjectable(), type); + } else { + mergeObjectsResultPanel = new Label(ID_MERGE_RESULT_OBJECT_DETAILS_PANEL, + pageBase.createStringResource("PageMergeObjects.noMergeResultObjectWarning")); + } + mergeObjectsResultPanel.setOutputMarkupId(true); + mainForm.add(mergeObjectsResultPanel); + initButtonPanel(mainForm); + } + + private void initButtonPanel(Form mainForm){ + AjaxSubmitButton switchDirectionButton = new AjaxSubmitButton(ID_SWITCH_DIRECTION_BUTTON, pageBase.createStringResource("PageMergeObjects.switchDirectionButton")) { + + @Override + protected void onSubmit(AjaxRequestTarget target, + org.apache.wicket.markup.html.form.Form form) { + } + + @Override + protected void onError(AjaxRequestTarget target, + org.apache.wicket.markup.html.form.Form form) { + target.add(pageBase.getFeedbackPanel()); + } + }; + mainForm.add(switchDirectionButton); + + AjaxSubmitButton mergeDeltaPreviewButton = new AjaxSubmitButton(ID_MERGE_DELTA_PREVIEW_BUTTON, + pageBase.createStringResource("PageMergeObjects.mergeDeltaPreviewButton")) { + + @Override + protected void onSubmit(AjaxRequestTarget target, + org.apache.wicket.markup.html.form.Form form) { + } + + @Override + protected void onError(AjaxRequestTarget target, + org.apache.wicket.markup.html.form.Form form) { + target.add(pageBase.getFeedbackPanel()); + } + }; + mainForm.add(mergeDeltaPreviewButton); + + AjaxSubmitButton mergeButton = new AjaxSubmitButton(ID_MERGE_BUTTON, + pageBase.createStringResource("PageMergeObjects.mergeButton")) { + + @Override + protected void onSubmit(AjaxRequestTarget target, + org.apache.wicket.markup.html.form.Form form) { + } + @Override + protected void onError(AjaxRequestTarget target, + org.apache.wicket.markup.html.form.Form form) { + target.add(pageBase.getFeedbackPanel()); + } + }; + mainForm.add(mergeButton); + + AjaxButton back = new AjaxButton(ID_BACK_BUTTON, pageBase.createStringResource("PageMergeObjects.backButton")) { + + @Override + public void onClick(AjaxRequestTarget target) { + pageBase.redirectBack(); + } + + }; + mainForm.add(back); + + } + + private List getMergeTypeNames(){ + List mergeTypeNamesList = new ArrayList<>(); + Task task = pageBase.createAnonymousTask(OPERATION_LOAD_MERGE_TYPE_NAMES); + OperationResult result = task.getResult(); + + PrismObject config; + try { + config = pageBase.getModelService().getObject(SystemConfigurationType.class, + SystemObjectsType.SYSTEM_CONFIGURATION.value(), null, task, result); + } catch (ObjectNotFoundException | SchemaException | SecurityViolationException + | CommunicationException | ConfigurationException e) { + LOGGER.error("Error getting system configuration: {}", e.getMessage(), e); + return null; + } + if (config != null && config.asObjectable() != null){ + List list = config.asObjectable().getMergeConfiguration(); + if (list != null) { + for (MergeConfigurationType mergeType : list) { + mergeTypeNamesList.add(mergeType.getName()); + } + if (mergeTypeNamesList.size() > 0){ + currentMergeType = mergeTypeNamesList.get(0); + } + } + } + return mergeTypeNamesList; + } + private PrismObject getMergeObjectsResult(){ + OperationResult result = new OperationResult(OPERATION_GET_MERGE_OBJECT_PREVIEW); + PrismObject mergeResultObject = null; + try { + Task task = pageBase.createSimpleTask(OPERATION_GET_MERGE_OBJECT_PREVIEW); + mergeResultObject = pageBase.getModelInteractionService().mergeObjectsPreviewObject(type, + mergeObject.getOid(), mergeWithObject.getOid(), currentMergeType, task, result); + } catch (Exception ex) { + result.recomputeStatus(); + result.recordFatalError("Couldn't get merge object for preview.", ex); + LoggingUtils.logUnexpectedException(LOGGER, "Couldn't get merge object for preview", ex); + pageBase.showResult(result); + } + return mergeResultObject; } } diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint.properties b/gui/admin-gui/src/main/resources/localization/Midpoint.properties index 6dcf6000758..840cef96f0b 100644 --- a/gui/admin-gui/src/main/resources/localization/Midpoint.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint.properties @@ -3379,4 +3379,16 @@ PageAuditLogDetails.deltaKey=Delta List ObjectDeltaOperationType.resourceName=Resource name ObjectDeltaOperationType.objectName=Object name ObjectDeltaOperationType.executionResult=Execution result +PageMergeObjects.noMergeResultObjectWarning=Merge preview object wasn't found +PageMergeObjects.title=Merge objects +PageMergeObjects.switchDirectionButton=Switch direction +PageMergeObjects.mergeButton=Merge +PageMergeObjects.mergeDeltaPreviewButton=Merge delta preview +PageMergeObjects.backButton=Back +PageMergeObjects.mergeType=Merge type +MergeType.DEFAULT=default +MergeType.EXPRESSION=expression +MergeType.ALL_RIGHT=allRight +MergeType.ALL_LEFT=allLeft +MergeType.EMPTY=empty PageMergeObjects.warningMessage=Two objects' oids should be specified \ No newline at end of file diff --git a/repo/security-api/src/main/java/com/evolveum/midpoint/security/api/AuthorizationConstants.java b/repo/security-api/src/main/java/com/evolveum/midpoint/security/api/AuthorizationConstants.java index 6b4a8e2afb6..b6ee945efdf 100644 --- a/repo/security-api/src/main/java/com/evolveum/midpoint/security/api/AuthorizationConstants.java +++ b/repo/security-api/src/main/java/com/evolveum/midpoint/security/api/AuthorizationConstants.java @@ -82,6 +82,9 @@ public class AuthorizationConstants { public static final QName AUTZ_UI_USER_DETAILS_QNAME = new QName(NS_AUTHORIZATION_UI, "userDetails"); public static final String AUTZ_UI_USER_DETAILS_URL = NS_AUTHORIZATION_UI + "#userDetails"; + public static final QName AUTZ_UI_MERGE_OBJECTS_QNAME = new QName(NS_AUTHORIZATION_UI, "mergeObjects"); + public static final String AUTZ_UI_MERGE_OBJECTS_URL = NS_AUTHORIZATION_UI + "#mergeObjects"; + public static final QName AUTZ_UI_ORG_STRUCT_QNAME = new QName(NS_AUTHORIZATION_UI, "orgStruct"); public static final String AUTZ_UI_ORG_STRUCT_URL = NS_AUTHORIZATION_UI + "#orgStruct";