package com.evolveum.midpoint.web.page.admin.roles;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismReferenceValue;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterExit;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.assignment.RelationTypes;
import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem;
import com.evolveum.midpoint.web.component.util.SelectableBean;
import com.evolveum.midpoint.web.page.admin.configuration.component.HeaderMenuAction;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.export.AbstractExportableColumn;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* Created by honchar.
*/
public class RoleGovernanceRelationsPanel extends RoleMemberPanel<RoleType> {
private static final long serialVersionUID = 1L;
private static final Trace LOGGER = TraceManager.getTrace(RoleGovernanceRelationsPanel.class);
private static final String DOT_CLASS = RoleGovernanceRelationsPanel.class.getName() + ".";
private static final String OPERATION_LOAD_APPROVER_RELATION_OBJECTS = DOT_CLASS + "loadApproverRelationObjects";
private static final String OPERATION_LOAD_OWNER_RELATION_OBJECTS = DOT_CLASS + "loadOwnerRelationObjects";
private static final String OPERATION_LOAD_MANAGER_RELATION_OBJECTS = DOT_CLASS + "loadManagerRelationObjects";
private LoadableModel<List<String>> approverRelationObjects;
private LoadableModel<List<String>> ownerRelationObjects;
private LoadableModel<List<String>> managerRelationObjects;
private boolean areModelsInitialized = false;
public RoleGovernanceRelationsPanel(String id, IModel<RoleType> model, List<RelationTypes> relations, PageBase pageBase) {
super(id, model, relations, pageBase);
}
@Override
protected List<InlineMenuItem> createNewMemberInlineMenuItems() {
List<InlineMenuItem> newMemberMenuItems = new ArrayList<>();
newMemberMenuItems.add(new InlineMenuItem(createStringResource("roleMemberPanel.menu.createApprover"),
false, new HeaderMenuAction(this) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
createFocusMemberPerformed(RelationTypes.APPROVER.getRelation(), target);
}
}));
newMemberMenuItems.add(new InlineMenuItem(createStringResource("roleMemberPanel.menu.assignApprovers"), false,
new HeaderMenuAction(this) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
addMembers(RelationTypes.APPROVER.getRelation(), target);
}
}));
newMemberMenuItems.add(new InlineMenuItem(createStringResource("roleMemberPanel.menu.createOwner"),
false, new HeaderMenuAction(this) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
createFocusMemberPerformed(RelationTypes.OWNER.getRelation(), target);
}
}));
newMemberMenuItems.add(new InlineMenuItem(createStringResource("roleMemberPanel.menu.assignOwners"), false,
new HeaderMenuAction(this) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
addMembers(RelationTypes.OWNER.getRelation(), target);
}
}));
newMemberMenuItems.add(new InlineMenuItem(createStringResource("TreeTablePanel.menu.createManager"),
false, new HeaderMenuAction(this) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
createFocusMemberPerformed(RelationTypes.MANAGER.getRelation(), target);
}
}));
newMemberMenuItems.add(new InlineMenuItem(createStringResource("TreeTablePanel.menu.addManagers"), false,
new HeaderMenuAction(this) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
addMembers(RelationTypes.MANAGER.getRelation(), target);
}
}));
return newMemberMenuItems;
}
@Override
protected List<InlineMenuItem> createRemoveMemberInlineMenuItems() {
return super.createRemoveMemberInlineMenuItems();
}
@Override
protected List<InlineMenuItem> createMemberRecomputeInlineMenuItems() {
return new ArrayList<>();
}
@Override
protected List<IColumn<SelectableBean<ObjectType>, String>> createMembersColumns() {
List<IColumn<SelectableBean<ObjectType>, String>> columns = super.createMembersColumns();
IColumn<SelectableBean<ObjectType>, String> column = new AbstractExportableColumn<SelectableBean<ObjectType>, String>(
createStringResource("roleMemberPanel.relation")) {
private static final long serialVersionUID = 1L;
@Override
public void populateItem(Item<ICellPopulator<SelectableBean<ObjectType>>> cellItem,
String componentId, IModel<SelectableBean<ObjectType>> rowModel) {
cellItem.add(new Label(componentId,
getRelationValue((FocusType) rowModel.getObject().getValue())));
}
@Override
public IModel<String> getDataModel(IModel<SelectableBean<ObjectType>> rowModel) {
return Model.of(getRelationValue((FocusType) rowModel.getObject().getValue()));
}
};
columns.add(column);
return columns;
}
private String getRelationValue(FocusType focusObject){
StringBuilder relations = new StringBuilder();
if (focusObject == null){
return "";
}
if (!areModelsInitialized) {
initLoadableModels();
areModelsInitialized = true;
}
if (approverRelationObjects.getObject().contains(focusObject.getOid())){
relations.append(createStringResource("RelationTypes.APPROVER").getString());
}
if (ownerRelationObjects.getObject().contains(focusObject.getOid())){
relations.append(relations.length() > 0 ? ", " : "");
relations.append(createStringResource("RelationTypes.OWNER").getString());
}
if (managerRelationObjects.getObject().contains(focusObject.getOid())){
relations.append(relations.length() > 0 ? ", " : "");
relations.append(createStringResource("RelationTypes.MANAGER").getString());
}
return relations.toString();
}
@Override
protected Collection<SelectorOptions<GetOperationOptions>> getSearchOptions(){
return SelectorOptions
.createCollection(GetOperationOptions.createDistinct());
}
private void initLoadableModels(){
approverRelationObjects = new LoadableModel<List<String>>(false) {
@Override
protected List<String> load() {
OperationResult result = new OperationResult(OPERATION_LOAD_APPROVER_RELATION_OBJECTS);
PrismReferenceValue rv = new PrismReferenceValue(getModelObject().getOid());
rv.setRelation(RelationTypes.APPROVER.getRelation());
ObjectQuery query = QueryBuilder.queryFor(FocusType.class, getPageBase().getPrismContext())
.item(FocusType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF)
.ref(rv).build();
List<PrismObject<FocusType>> approverRelationObjects =
WebModelServiceUtils.searchObjects(FocusType.class, query, result, getPageBase());
return getObjectOidsList(approverRelationObjects);
}
};
ownerRelationObjects = new LoadableModel<List<String>>(false) {
@Override
protected List<String> load() {
OperationResult result = new OperationResult(OPERATION_LOAD_OWNER_RELATION_OBJECTS);
PrismReferenceValue rv = new PrismReferenceValue(getModelObject().getOid());
rv.setRelation(RelationTypes.OWNER.getRelation());
ObjectQuery query = QueryBuilder.queryFor(FocusType.class, getPageBase().getPrismContext())
.item(FocusType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF)
.ref(rv).build();
List<PrismObject<FocusType>> ownerRelationObjects =
WebModelServiceUtils.searchObjects(FocusType.class, query, result, getPageBase());
return getObjectOidsList(ownerRelationObjects);
}
};
managerRelationObjects = new LoadableModel<List<String>>(false) {
@Override
protected List<String> load() {
OperationResult result = new OperationResult(OPERATION_LOAD_MANAGER_RELATION_OBJECTS);
PrismReferenceValue rv = new PrismReferenceValue(getModelObject().getOid());
rv.setRelation(RelationTypes.MANAGER.getRelation());
ObjectQuery query = QueryBuilder.queryFor(FocusType.class, getPageBase().getPrismContext())
.item(FocusType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF)
.ref(rv).build();
List<PrismObject<FocusType>> managerRelationObjects =
WebModelServiceUtils.searchObjects(FocusType.class, query, result, getPageBase());
return getObjectOidsList(managerRelationObjects);
}
};
}
private List<String> getObjectOidsList(List<PrismObject<FocusType>> objectList){
List<String> oidsList = new ArrayList<>();
if (objectList == null){
return oidsList;
}
for (PrismObject<FocusType> object : objectList){
if (object == null){
continue;
}
if (!oidsList.contains(object.getOid())){
oidsList.add(object.getOid());
}
}
return oidsList;
}
}