Skip to content

Commit

Permalink
Merge Objects gui implementing
Browse files Browse the repository at this point in the history
  • Loading branch information
KaterynaHonchar committed Oct 17, 2016
1 parent 16c7e06 commit 29fa771
Show file tree
Hide file tree
Showing 5 changed files with 277 additions and 26 deletions.
Expand Up @@ -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;
Expand All @@ -26,7 +33,17 @@
/**
* Created by honchar.
*/
public class PageMergeObjects<F extends FocusType> 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<F extends FocusType> extends PageAdmin {
private static final String ID_MERGE_PANEL = "mergePanel";
private F mergeObject;
private F mergeWithObject;
Expand All @@ -41,16 +58,20 @@ public PageMergeObjects(F mergeObject, F mergeWithObject, Class<F> 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;
}
}
Expand Up @@ -16,32 +16,35 @@
-->

<wicket:panel xmlns:wicket="http://wicket.apache.org">
<!--<form wicket:id="mainForm" class="form-horizontal">-->
<form wicket:id="mainForm" class="form-horizontal">
<div class="row">
<!--<select wicket:id="mergeType"/>-->
<!---->
<!--<div wicket:id="infoHelperButton"/>-->
<div class="col-xs-1" style="padding-bottom: 20px;">
<span><wicket:message key="PageMergeObjects.mergeType"/></span>
</div>
<div class="col-xs-3">
<div wicket:id="mergeType"/>
</div>
</div>
<div class="row">
<div wicket:id="mergeObjectDetailsPanel" class="col-md-3"/>
<div wicket:id="mergeObjectDetailsPanel" class="col-xs-3"/>
<div class="icon">
<i class="fa fa-plus" style="font-size: 30px;"></i>
<i class="fa fa-plus col-xs-1" style="font-size: 30px;"></i>
</div>
<div class="col-md-1 fa fa-plus"/>
<div wicket:id="mergeWithObjectDetailsPanel" class="col-md-3"/>
<div wicket:id="mergeWithObjectDetailsPanel" class="col-xs-3"/>
<div class="icon">
<i class="fa fa-arrow-right" style="font-size: 30px;"></i>
<i class="fa fa-arrow-right col-xs-1" style="font-size: 30px;"></i>
</div>
<!--<div wicket:id="mergeResultObjectDetailsPanel" class="col-md-3"/>-->
<div wicket:id="mergeResultObjectDetailsPanel" class="col-xs-3"/>
</div>
<wicket:child/>

<!--<div class="main-button-bar">-->
<!--<span class="button-group">-->
<!--<a class="btn btn-default" wicket:id="back"/>-->
<!--</span>-->
<!--<a class="btn btn-primary" wicket:id="switchDirection"/>-->
<!--<a class="btn btn-primary" wicket:id="merge"/>-->
<!--</div>-->
<!--</form>-->
<div class="main-button-bar" style="padding-top: 20px;">
<span class="button-group">
<a class="btn btn-default" wicket:id="back"/>
</span>
<a class="btn btn-primary" wicket:id="switchDirection"/>
<a class="btn btn-primary" wicket:id="mergeDeltaPreview"/>
<a class="btn btn-primary" wicket:id="merge"/>
</div>
</form>
</wicket:panel>
Expand Up @@ -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<F extends FocusType> 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<F> type;
private PageBase pageBase;
private IModel<String> mergeTypeModel;
private String currentMergeType = "";
private IModel<List<String>> mergeTypeChoicesModel;
private List<String> mergeTypeChoices;

public MergeObjectsPanel(String id){
super(id);
}

public MergeObjectsPanel(String id, F mergeObject, F mergeWithObject, Class<F> type){
public MergeObjectsPanel(String id, F mergeObject, F mergeWithObject, Class<F> 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<String>() {
@Override
public String getObject() {
return currentMergeType;
}

@Override
public void setObject(String mergeType) {
currentMergeType = mergeType;
}

@Override
public void detach() {

}
};

mergeTypeChoicesModel = new IModel<List<String>>() {
@Override
public List<String> getObject() {
return mergeTypeChoices;
}

@Override
public void setObject(List<String> 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<F> 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<String> getMergeTypeNames(){
List<String> mergeTypeNamesList = new ArrayList<>();
Task task = pageBase.createAnonymousTask(OPERATION_LOAD_MERGE_TYPE_NAMES);
OperationResult result = task.getResult();

PrismObject<SystemConfigurationType> 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<MergeConfigurationType> 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<F> getMergeObjectsResult(){
OperationResult result = new OperationResult(OPERATION_GET_MERGE_OBJECT_PREVIEW);
PrismObject<F> 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;
}
}
12 changes: 12 additions & 0 deletions gui/admin-gui/src/main/resources/localization/Midpoint.properties
Expand Up @@ -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

0 comments on commit 29fa771

Please sign in to comment.