com.evolveum.midpoint.web.component.assignment.AssignmentDataTablePanel.java Source code

Java tutorial

Introduction

Here is the source code for com.evolveum.midpoint.web.component.assignment.AssignmentDataTablePanel.java

Source

/*
 * Copyright (c) 2010-2017 Evolveum
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.evolveum.midpoint.web.component.assignment;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.namespace.QName;

import org.apache.commons.lang.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.markup.html.WebMarkupContainer;
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 org.apache.wicket.model.PropertyModel;

import com.evolveum.midpoint.gui.api.GuiStyleConstants;
import com.evolveum.midpoint.gui.api.component.TypedAssignablePanel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.prism.query.ObjectPaging;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
import com.evolveum.midpoint.web.component.AjaxButton;
import com.evolveum.midpoint.web.component.AjaxIconButton;
import com.evolveum.midpoint.web.component.data.BoxedTablePanel;
import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn;
import com.evolveum.midpoint.web.component.data.column.ColumnMenuAction;
import com.evolveum.midpoint.web.component.data.column.DoubleButtonColumn;
import com.evolveum.midpoint.web.component.data.column.IconColumn;
import com.evolveum.midpoint.web.component.data.column.InlineMenuButtonColumn;
import com.evolveum.midpoint.web.component.data.column.LinkColumn;
import com.evolveum.midpoint.web.component.input.DropDownChoicePanel;
import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem;
import com.evolveum.midpoint.web.component.util.ListDataProvider;
import com.evolveum.midpoint.web.component.util.SelectableBean;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.page.admin.configuration.component.ChooseTypePanel;
import com.evolveum.midpoint.web.page.admin.dto.ObjectViewDto;
import com.evolveum.midpoint.web.session.AssignmentsTabStorage;
import com.evolveum.midpoint.web.session.UserProfileStorage;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType;

/**
 * Created by honchar.
 */
public class AssignmentDataTablePanel extends AbstractAssignmentListPanel {
    private static final String ID_ASSIGNMENTS = "assignments";
    private static final String ID_RELATION = "relation";
    private static final String ID_ASSIGNMENTS_TABLE = "assignmentsTable";
    private static final String ID_NEW_ASSIGNMENT_BUTTON = "newAssignmentButton";
    private static final String ID_SHOW_ALL_ASSIGNMENTS_BUTTON = "showAllAssignmentsButton";

    private Map<RelationTypes, List<AssignmentEditorDto>> relationAssignmentsMap = new HashMap<>();
    private IModel<RelationTypes> relationModel = Model.of(RelationTypes.MEMBER);

    public AssignmentDataTablePanel(String id, IModel<List<AssignmentEditorDto>> assignmentsModel,
            PageBase pageBase) {
        super(id, assignmentsModel);
        initPaging();

    }

    @Override
    protected void onInitialize() {
        super.onInitialize();

        WebMarkupContainer assignmentsContainer = new WebMarkupContainer(ID_ASSIGNMENTS);
        assignmentsContainer.setOutputMarkupId(true);
        add(assignmentsContainer);

        addOrReplaceAssignmentsTable(assignmentsContainer);

        AjaxIconButton newObjectIcon = new AjaxIconButton(ID_NEW_ASSIGNMENT_BUTTON, new Model<>("fa fa-plus"),
                createStringResource("MainObjectListPanel.newObject")) {

            private static final long serialVersionUID = 1L;

            @Override
            public void onClick(AjaxRequestTarget target) {
                TypedAssignablePanel panel = new TypedAssignablePanel(getPageBase().getMainPopupBodyId(),
                        RoleType.class) {
                    private static final long serialVersionUID = 1L;

                    @Override
                    protected void addPerformed(AjaxRequestTarget target, List selected, QName relation) {
                        addSelectedAssignmentsPerformed(target, selected, relation);
                    }

                };
                panel.setOutputMarkupId(true);
                getPageBase().showMainPopup(panel, target);
            }
        };
        newObjectIcon.add(new VisibleEnableBehaviour() {
            private static final long serialVersionUID = 1L;

            @Override
            public boolean isVisible() {
                return WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_ADMIN_ASSIGN_ACTION_URI);
            }
        });
        assignmentsContainer.add(newObjectIcon);

    }

    protected void showAllAssignments(AjaxRequestTarget target) {
    }

    private void addSelectedAssignmentsPerformed(AjaxRequestTarget target, List<ObjectType> assignmentsList,
            QName relation) {
        if (assignmentsList == null || assignmentsList.isEmpty()) {
            warn(getPageBase().getString("AssignmentTablePanel.message.noAssignmentSelected"));
            target.add(getPageBase().getFeedbackPanel());
            return;
        }
        for (ObjectType object : assignmentsList) {
            AssignmentEditorDto dto = createAssignmentFromSelectedObjects(object, relation);
            getAssignmentModel().getObject().add(0, dto);
        }
        relationModel.setObject(RelationTypes.getRelationType(relation));
        initPaging();
        addOrReplaceAssignmentsTable(getAssignmentsContainer());
        reloadMainFormButtons(target);
        target.add(getAssignmentsContainer());
    }

    private void addOrReplaceAssignmentsTable(WebMarkupContainer assignmentsContainer) {
        fillInRelationAssignmentsMap();
        DropDownChoicePanel relation = WebComponentUtil.createEnumPanel(RelationTypes.class, ID_RELATION,
                WebComponentUtil.createReadonlyModelFromEnum(RelationTypes.class), relationModel, this, false);
        relation.getBaseFormComponent().add(new AjaxFormComponentUpdatingBehavior("change") {
            private static final long serialVersionUID = 1L;

            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                relationModel.setObject((RelationTypes) relation.getBaseFormComponent().getConvertedInput());
                addOrReplaceAssignmentsTable(getAssignmentsContainer());
                target.add(AssignmentDataTablePanel.this.get(ID_ASSIGNMENTS).get(ID_ASSIGNMENTS_TABLE));
            }
        });
        relation.setOutputMarkupId(true);
        relation.setOutputMarkupPlaceholderTag(true);
        assignmentsContainer.addOrReplace(relation);

        AjaxButton showAllAssignmentsButton = new AjaxButton(ID_SHOW_ALL_ASSIGNMENTS_BUTTON,
                createStringResource("AssignmentTablePanel.menu.showAllAssignments")) {
            @Override
            public void onClick(AjaxRequestTarget ajaxRequestTarget) {
                showAllAssignments(ajaxRequestTarget);
            }
        };
        assignmentsContainer.addOrReplace(showAllAssignmentsButton);

        ListDataProvider<AssignmentEditorDto> assignmentsProvider = new ListDataProvider<AssignmentEditorDto>(this,
                Model.ofList(relationAssignmentsMap.get(relationModel.getObject())), false) {
            private static final long serialVersionUID = 1L;

            @Override
            protected void saveProviderPaging(ObjectQuery query, ObjectPaging paging) {
                getAssignmentsStorage().setPaging(paging);
            }

        };
        BoxedTablePanel<AssignmentEditorDto> assignmentTable = new BoxedTablePanel<AssignmentEditorDto>(
                ID_ASSIGNMENTS_TABLE, assignmentsProvider, initColumns(),
                UserProfileStorage.TableId.ASSIGNMENTS_TAB_TABLE,
                (int) getPageBase().getItemsPerPage(UserProfileStorage.TableId.ASSIGNMENTS_TAB_TABLE)) {
            private static final long serialVersionUID = 1L;

            //            @Override
            //            protected Item<AssignmentEditorDto> customizeNewRowItem(Item<AssignmentEditorDto> item, IModel<AssignmentEditorDto> model) {
            //                    item.add(AttributeModifier.append("class", AssignmentsUtil.createAssignmentStatusClassModel(model)));
            //                return item;
            //            }

            @Override
            public int getItemsPerPage() {
                return getPageBase().getSessionStorage().getUserProfile().getTables()
                        .get(UserProfileStorage.TableId.ASSIGNMENTS_TAB_TABLE);
            }

        };
        assignmentTable.setOutputMarkupId(true);
        assignmentTable.setCurrentPage(getAssignmentsStorage().getPaging());
        assignmentsContainer.addOrReplace(assignmentTable);

    }

    private List<IColumn<AssignmentEditorDto, String>> initColumns() {
        List<IColumn<AssignmentEditorDto, String>> columns = new ArrayList<>();

        columns.add(new CheckBoxHeaderColumn<AssignmentEditorDto>());

        columns.add(new IconColumn<AssignmentEditorDto>(Model.of("")) {
            private static final long serialVersionUID = 1L;

            @Override
            protected IModel<String> createIconModel(IModel<AssignmentEditorDto> rowModel) {
                if (rowModel.getObject().getType() == null) {
                    return Model.of("");
                }
                return Model.of(rowModel.getObject().getType().getIconCssClass());
            }

            @Override
            protected IModel<String> createTitleModel(IModel<AssignmentEditorDto> rowModel) {
                return AssignmentsUtil.createAssignmentIconTitleModel(AssignmentDataTablePanel.this,
                        rowModel.getObject().getType());
            }

        });

        columns.add(new LinkColumn<AssignmentEditorDto>(
                createStringResource("AssignmentDataTablePanel.targetColumnName")) {
            private static final long serialVersionUID = 1L;

            @Override
            public void populateItem(Item<ICellPopulator<AssignmentEditorDto>> cellItem, String componentId,
                    final IModel<AssignmentEditorDto> rowModel) {
                if (rowModel.getObject().getTargetRef() == null) {
                    cellItem.add(new Label(componentId, createLinkModel(rowModel)));
                } else {
                    super.populateItem(cellItem, componentId, rowModel);
                }
            }

            @Override
            protected IModel createLinkModel(IModel<AssignmentEditorDto> rowModel) {
                String targetObjectName = rowModel.getObject().getName();
                if (targetObjectName != null && targetObjectName.trim().endsWith("-")) {
                    targetObjectName = targetObjectName.substring(0, targetObjectName.lastIndexOf("-"));
                }
                return Model.of(targetObjectName != null ? targetObjectName : "");
            }

            @Override
            public void onClick(AjaxRequestTarget target, IModel<AssignmentEditorDto> rowModel) {
                ObjectReferenceType targetObject = rowModel.getObject().getTargetRef();
                WebComponentUtil.dispatchToObjectDetailsPage(rowModel.getObject().getType().getType(),
                        targetObject.getOid(), AssignmentDataTablePanel.this, true);
            }
        });
        //commented since these columns are not used
        //        columns.add(new DirectlyEditablePropertyColumn<AssignmentEditorDto>(createStringResource("AssignmentDataTablePanel.descriptionColumnName"), AssignmentEditorDto.F_DESCRIPTION){
        //            private static final long serialVersionUID = 1L;
        //
        //            @Override
        //            public void populateItem(Item<ICellPopulator<AssignmentEditorDto>> cellItem, String componentId,
        //                                     final IModel<AssignmentEditorDto> rowModel) {
        //                super.populateItem(cellItem, componentId, rowModel);
        //                cellItem.add(AssignmentsUtil.getEnableBehavior(rowModel));
        //            }
        //        });
        //        columns.add(new AbstractColumn<AssignmentEditorDto, String>(createStringResource("AssignmentDataTablePanel.organizationColumnName")){
        //            private static final long serialVersionUID = 1L;
        //
        //            @Override
        //            public void populateItem(Item<ICellPopulator<AssignmentEditorDto>> cellItem, String componentId, final IModel<AssignmentEditorDto> rowModel) {
        //                ObjectQuery orgQuery = QueryBuilder.queryFor(OrgType.class, getPageBase().getPrismContext())
        //                        .item(OrgType.F_TENANT).eq(false)
        //                        .or().item(OrgType.F_TENANT).isNull()
        //                        .build();
        //                ChooseTypePanel orgPanel = getChooseOrgPanel(componentId, rowModel, orgQuery);
        //                orgPanel.add(visibleIfRoleBehavior(rowModel));
        //                cellItem.add(orgPanel);
        //                cellItem.add(AssignmentsUtil.getEnableBehavior(rowModel));
        //            }
        //
        //        });
        //        columns.add(new AbstractColumn<AssignmentEditorDto, String>(createStringResource("AssignmentDataTablePanel.tenantColumnName")){
        //            private static final long serialVersionUID = 1L;
        //
        //            @Override
        //            public void populateItem(Item<ICellPopulator<AssignmentEditorDto>> cellItem, String componentId, final IModel<AssignmentEditorDto> rowModel) {
        //                ObjectQuery tenantQuery = QueryBuilder.queryFor(OrgType.class, getPageBase().getPrismContext())
        //                        .item(OrgType.F_TENANT).eq(true)
        //                        .build();
        //                ChooseTypePanel tenantPanel = getChooseOrgPanel(componentId, rowModel, tenantQuery);
        //                tenantPanel.add(visibleIfRoleBehavior(rowModel));
        //                cellItem.add(tenantPanel);
        //                cellItem.add(AssignmentsUtil.getEnableBehavior(rowModel));
        //            }
        //
        //        });
        //        columns.add(new LinkColumn<AssignmentEditorDto>(createStringResource("AssignmentDataTablePanel.activationColumnName")) {
        //            private static final long serialVersionUID = 1L;
        //
        //            @Override
        //            public void populateItem(Item<ICellPopulator<AssignmentEditorDto>> cellItem, String componentId,
        //                                     final IModel<AssignmentEditorDto> rowModel) {
        //                super.populateItem(cellItem, componentId, rowModel);
        //                cellItem.setEnabled(false);
        ////                cellItem.add(AssignmentsUtil.getEnableBehavior(rowModel));
        //            }
        //
        //            @Override
        //            protected IModel createLinkModel(IModel<AssignmentEditorDto> rowModel) {
        //                IModel<String> activationLabelModel = AssignmentsUtil.createActivationTitleModel(rowModel,"", AssignmentDataTablePanel.this);
        //                return StringUtils.isEmpty(activationLabelModel.getObject()) ?
        //                        createStringResource("AssignmentEditorPanel.undefined") : activationLabelModel;
        //            }
        //
        //            @Override
        //            public void onClick(AjaxRequestTarget target, IModel<AssignmentEditorDto> rowModel) {
        //                        AssignmentActivationPopupablePanel popupPanel = new AssignmentActivationPopupablePanel(pageBase.getMainPopupBodyId(), rowModel){
        //                            private static final long serialVersionUID = 1L;
        //
        //                            @Override
        //                            protected void reloadDateComponent(AjaxRequestTarget target) {
        //                                target.add(getAssignmentsContainer());
        //                            }
        //                        };
        //                        pageBase.showMainPopup(popupPanel, target);
        //            }
        //        });
        columns.add(new AbstractColumn<AssignmentEditorDto, String>(
                createStringResource("AssignmentDataTablePanel.activationColumnName")) {
            @Override
            public void populateItem(Item<ICellPopulator<AssignmentEditorDto>> cellItem, String componentId,
                    final IModel<AssignmentEditorDto> rowModel) {
                IModel<String> activationLabelModel = AssignmentsUtil.createActivationTitleModel(
                        rowModel.getObject().getActivation(), "", AssignmentDataTablePanel.this);
                cellItem.add(new Label(componentId,
                        StringUtils.isEmpty(activationLabelModel.getObject())
                                ? createStringResource("AssignmentEditorPanel.undefined")
                                : activationLabelModel));
            }
        });

        if (WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_ADMIN_UNASSIGN_ACTION_URI)) {
            columns.add(
                    new InlineMenuButtonColumn<AssignmentEditorDto>(getAssignmentMenuActions(), 1, getPageBase()));
        }
        return columns;
    }

    private List<InlineMenuItem> getAssignmentMenuActions() {
        List<InlineMenuItem> menuItems = new ArrayList<>();
        menuItems.add(new InlineMenuItem(createStringResource("PageBase.button.delete"), new Model<Boolean>(true),
                new Model<Boolean>(true), false, new ColumnMenuAction<SelectableBean<ResourceType>>() {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public void onClick(AjaxRequestTarget target) {
                        if (getRowModel() == null) {
                            deleteAssignmentPerformed(target, null);
                        } else {
                            AssignmentEditorDto rowDto = (AssignmentEditorDto) getRowModel().getObject();
                            deleteAssignmentPerformed(target, rowDto);
                        }
                    }
                }, 0, GuiStyleConstants.CLASS_DELETE_MENU_ITEM,
                DoubleButtonColumn.BUTTON_COLOR_CLASS.DANGER.toString()));
        return menuItems;
    }

    private VisibleEnableBehaviour visibleIfRoleBehavior(IModel<AssignmentEditorDto> assignmentModel) {
        return new VisibleEnableBehaviour() {
            private static final long serialVersionUID = 1L;

            @Override
            public boolean isVisible() {
                return AssignmentEditorDtoType.ROLE.equals(assignmentModel.getObject().getType());
            }
        };
    }

    private ChooseTypePanel<OrgType> getChooseOrgPanel(String id, IModel<AssignmentEditorDto> model,
            ObjectQuery query) {
        ChooseTypePanel chooseOrgPanel = new ChooseTypePanel(id,
                new PropertyModel<ObjectViewDto>(model, AssignmentEditorDto.F_TENANT_REF)) {
            private static final long serialVersionUID = 1L;

            @Override
            protected ObjectQuery getChooseQuery() {
                return query;
            }

            @Override
            public Class getObjectTypeClass() {
                return OrgType.class;
            }

            @Override
            protected boolean isSearchEnabled() {
                return true;
            }

            @Override
            protected QName getSearchProperty() {
                return OrgType.F_NAME;
            }
        };
        return chooseOrgPanel;
    }

    private void fillInRelationAssignmentsMap() {
        relationAssignmentsMap = new HashMap<>();
        if (getAssignmentModel() == null || getAssignmentModel().getObject() == null) {
            return;
        }
        for (RelationTypes relation : RelationTypes.values()) {
            List<AssignmentEditorDto> assignmentList = new ArrayList<>();
            for (AssignmentEditorDto assignmentDto : getAssignmentModel().getObject()) {
                if (relation.equals(RelationTypes.MEMBER)
                        && AssignmentEditorDtoType.CONSTRUCTION.equals(assignmentDto.getType())) {
                    assignmentList.add(assignmentDto);
                    continue;
                }
                if (AssignmentEditorDtoType.USER.equals(assignmentDto.getType())
                        || AssignmentEditorDtoType.POLICY_RULE.equals(assignmentDto.getType())) {
                    continue;
                }
                String relationLocalPart = relation.getRelation() == null
                        ? SchemaConstants.ORG_DEFAULT.getLocalPart()
                        : relation.getRelation().getLocalPart();
                String assignmentDtoRelation = assignmentDto.getRelation();
                if (relationLocalPart.equals(assignmentDtoRelation)
                        || (relation.getRelation() == null && assignmentDtoRelation == null)) {
                    assignmentList.add(assignmentDto);
                }
            }
            relationAssignmentsMap.put(relation, assignmentList);
        }
    }

    private WebMarkupContainer getAssignmentsContainer() {
        return (WebMarkupContainer) get(ID_ASSIGNMENTS);
    }

    protected void reloadMainAssignmentsComponent(AjaxRequestTarget target) {
        addOrReplaceAssignmentsTable(getAssignmentsContainer());
        target.add(getAssignmentsContainer());
    }

    private AssignmentsTabStorage getAssignmentsStorage() {
        return getPageBase().getSessionStorage().getAssignmentsTabStorage();
    }

    private void initPaging() {
        getAssignmentsStorage().setPaging(ObjectPaging.createPaging(0,
                (int) getPageBase().getItemsPerPage(UserProfileStorage.TableId.ASSIGNMENTS_TAB_TABLE)));
    }
}