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

Java tutorial

Introduction

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

Source

/*
 * Copyright (c) 2016 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 com.evolveum.midpoint.gui.api.GuiStyleConstants;
import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.schema.constants.RelationTypes;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.page.admin.roles.PageRole;
import com.evolveum.midpoint.web.page.admin.services.PageService;
import com.evolveum.midpoint.web.page.admin.users.PageOrgUnit;
import com.evolveum.midpoint.web.page.self.PageAssignmentDetails;
import com.evolveum.midpoint.web.session.RoleCatalogStorage;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;

import javax.xml.namespace.QName;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by honchar.
 */
public class RoleCatalogItemButton extends BasePanel<AssignmentEditorDto> {
    private static final long serialVersionUID = 1L;

    private static final String ID_ITEM_BUTTON_CONTAINER = "itemButtonContainer";
    private static final String ID_INNER = "inner";
    private static final String ID_INNER_LABEL = "innerLabel";
    private static final String ID_INNER_DESCRIPTION = "innerDescription";
    private static final String ID_TYPE_ICON = "typeIcon";
    private static final String ID_ALREADY_ASSIGNED_ICON = "alreadyAssignedIcon";
    private static final String ID_ADD_TO_CART_LINK = "addToCartLink";
    private static final String ID_ADD_TO_CART_LINK_LABEL = "addToCartLinkLabel";
    private static final String ID_ADD_TO_CART_LINK_ICON = "addToCartLinkIcon";
    private static final String ID_DETAILS_LINK = "detailsLink";
    private static final String ID_DETAILS_LINK_LABEL = "detailsLinkLabel";
    private static final String ID_DETAILS_LINK_ICON = "detailsLinkIcon";
    private boolean plusIconClicked = false;

    private static final String DOT_CLASS = RoleCatalogItemButton.class.getName() + ".";
    private static final String OPERATION_LOAD_OBJECT = DOT_CLASS + "loadObject";
    private static final String OPERATION_LOAD_RELATION_DEFINITION_LIST = DOT_CLASS + "loadRelationDefinitionList";
    private static final Trace LOGGER = TraceManager.getTrace(RoleCatalogItemButton.class);

    public RoleCatalogItemButton(String id, IModel<AssignmentEditorDto> model) {
        super(id, model);
    }

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

    private void initLayout() {
        setOutputMarkupId(true);

        WebMarkupContainer itemButtonContainer = new WebMarkupContainer(ID_ITEM_BUTTON_CONTAINER);
        itemButtonContainer.setOutputMarkupId(true);
        itemButtonContainer.add(new AttributeAppender("class", getBackgroundClass(getModelObject())));
        add(itemButtonContainer);

        AjaxLink inner = new AjaxLink(ID_INNER) {
            private static final long serialVersionUID = 1L;

            @Override
            public void onClick(AjaxRequestTarget ajaxRequestTarget) {
                targetObjectDetailsPerformed(RoleCatalogItemButton.this.getModelObject(), ajaxRequestTarget);
            }
        };
        inner.add(new VisibleEnableBehaviour() {
            private static final long serialVersionUID = 1L;

            @Override
            public boolean isEnabled() {
                return isMultiUserRequest() || canAssign(RoleCatalogItemButton.this.getModelObject());
            }
        });
        inner.add(new AttributeAppender("title", getModelObject().getName()));
        itemButtonContainer.add(inner);

        Label nameLabel = new Label(ID_INNER_LABEL, getModelObject().getName());
        inner.add(nameLabel);

        Label descriptionLabel = new Label(ID_INNER_DESCRIPTION,
                getModelObject().getTargetRef() != null ? getModelObject().getTargetRef().getDescription() : "");
        descriptionLabel.setOutputMarkupId(true);
        inner.add(descriptionLabel);

        AjaxLink detailsLink = new AjaxLink(ID_DETAILS_LINK) {
            private static final long serialVersionUID = 1L;

            @Override
            public void onClick(AjaxRequestTarget ajaxRequestTarget) {
                assignmentDetailsPerformed(RoleCatalogItemButton.this.getModelObject(), ajaxRequestTarget);
            }
        };
        detailsLink.add(getFooterLinksEnableBehaviour());
        detailsLink.add(AttributeAppender.append("title",
                AssignmentsUtil.getShoppingCartAssignmentsLimitReachedTitleModel(getPageBase())));
        detailsLink.add(AttributeAppender.append("class", new LoadableModel<String>() {
            @Override
            protected String load() {
                return detailsLink.isEnabled() ? "shopping-cart-item-button-details"
                        : "shopping-cart-item-button-details-disabled";
            }
        }));
        itemButtonContainer.add(detailsLink);

        Label detailsLinkLabel = new Label(ID_DETAILS_LINK_LABEL,
                createStringResource("MultiButtonPanel.detailsLink"));
        detailsLinkLabel.setRenderBodyOnly(true);
        detailsLink.add(detailsLinkLabel);

        AjaxLink detailsLinkIcon = new AjaxLink(ID_DETAILS_LINK_ICON) {
            private static final long serialVersionUID = 1L;

            @Override
            public void onClick(AjaxRequestTarget target) {
            }

        };
        detailsLinkIcon.add(getFooterLinksEnableBehaviour());
        detailsLink.add(detailsLinkIcon);

        AjaxLink addToCartLink = new AjaxLink(ID_ADD_TO_CART_LINK) {
            private static final long serialVersionUID = 1L;

            @Override
            public void onClick(AjaxRequestTarget ajaxRequestTarget) {
                addAssignmentPerformed(RoleCatalogItemButton.this.getModelObject(), ajaxRequestTarget);
            }
        };
        addToCartLink.add(getFooterLinksEnableBehaviour());
        addToCartLink.add(AttributeAppender.append("title",
                AssignmentsUtil.getShoppingCartAssignmentsLimitReachedTitleModel(getPageBase())));
        addToCartLink.add(AttributeAppender.append("class", new LoadableModel<String>() {
            @Override
            protected String load() {
                return addToCartLink.isEnabled() ? "shopping-cart-item-button-add"
                        : "shopping-cart-item-button-add-disabled";
            }
        }));
        itemButtonContainer.add(addToCartLink);

        AjaxLink addToCartLinkIcon = new AjaxLink(ID_ADD_TO_CART_LINK_ICON) {
            private static final long serialVersionUID = 1L;

            @Override
            public void onClick(AjaxRequestTarget target) {
            }

        };
        addToCartLinkIcon.add(getFooterLinksEnableBehaviour());
        addToCartLink.add(addToCartLinkIcon);

        WebMarkupContainer icon = new WebMarkupContainer(ID_TYPE_ICON);
        icon.add(new AttributeAppender("class",
                WebComponentUtil.createDefaultBlackIcon(getModelObject().getType().getQname())));
        itemButtonContainer.add(icon);

        WebMarkupContainer alreadyAssignedIcon = new WebMarkupContainer(ID_ALREADY_ASSIGNED_ICON);
        alreadyAssignedIcon.add(new AttributeAppender("title", getAlreadyAssignedIconTitleModel(getModelObject())));
        alreadyAssignedIcon.add(new VisibleEnableBehaviour() {
            private static final long serialVersionUID = 1L;

            @Override
            public boolean isVisible() {
                return !isMultiUserRequest() && getModelObject().isAlreadyAssigned();
            }
        });
        itemButtonContainer.add(alreadyAssignedIcon);

    }

    private String getBackgroundClass(AssignmentEditorDto dto) {
        ActivationStatusType activation = getItemEffectiveStatusType(dto.getOldValue());
        if (!isMultiUserRequest() && !canAssign(dto) || ActivationStatusType.ARCHIVED.equals(activation)
                || ActivationStatusType.DISABLED.equals(activation)) {
            return GuiStyleConstants.CLASS_DISABLED_OBJECT_ROLE_BG;
        } else if (AssignmentEditorDtoType.ROLE.equals(dto.getType())) {
            return GuiStyleConstants.CLASS_OBJECT_ROLE_BG;
        } else if (AssignmentEditorDtoType.SERVICE.equals(dto.getType())) {
            return GuiStyleConstants.CLASS_OBJECT_SERVICE_BG;
        } else if (AssignmentEditorDtoType.ORG_UNIT.equals(dto.getType())) {
            return GuiStyleConstants.CLASS_OBJECT_ORG_BG;
        } else {
            return "";
        }
    }

    private ActivationStatusType getItemEffectiveStatusType(PrismContainerValue<AssignmentType> assignmentValue) {
        if (assignmentValue == null || assignmentValue.asContainerable() == null) {
            return null;
        }
        AssignmentType assignment = assignmentValue.asContainerable();
        if (assignment.getTarget() == null || !(assignment.getTarget() instanceof AbstractRoleType)) {
            return null;
        }
        ActivationType activation = ((AbstractRoleType) assignment.getTarget()).getActivation();
        return activation != null ? activation.getEffectiveStatus() : null;
    }

    private IModel<String> getAlreadyAssignedIconTitleModel(AssignmentEditorDto dto) {
        List<QName> assignedRelations = dto.getAssignedRelationsList();
        StringBuilder relations = new StringBuilder();
        if (assignedRelations != null && assignedRelations.size() > 0) {
            List<RelationDefinitionType> defs = WebComponentUtil
                    .getRelationDefinitions(RoleCatalogItemButton.this.getPageBase());
            for (QName relation : assignedRelations) {
                RelationDefinitionType def = ObjectTypeUtil.findRelationDefinition(defs, relation);
                String relationLabel;
                if (def == null || def.getCategory() == null || def.getDisplay().getLabel() == null) {
                    relationLabel = relation.getLocalPart();
                } else {
                    relationLabel = createStringResource(def.getDisplay().getLabel()).getString();
                }
                if (!relations.toString().contains(relationLabel)) {
                    if (!relations.toString().isEmpty()) {
                        relations.append(", ");
                    }
                    relations.append(relationLabel);
                }
            }
        }
        return createStringResource("MultiButtonPanel.alreadyAssignedIconTitle", relations.toString());
    }

    private VisibleEnableBehaviour getFooterLinksEnableBehaviour() {
        return new VisibleEnableBehaviour() {
            private static final long serialVersionUID = 1L;

            @Override
            public boolean isEnabled() {
                int assignmentsLimit = getRoleCatalogStorage().getAssignmentRequestLimit();
                return !AssignmentsUtil.isShoppingCartAssignmentsLimitReached(assignmentsLimit,
                        RoleCatalogItemButton.this.getPageBase())
                        && (isMultiUserRequest() || canAssign(getModelObject()));
            }
        };
    }

    private void assignmentDetailsPerformed(AssignmentEditorDto assignment, AjaxRequestTarget target) {
        if (!plusIconClicked) {
            assignment.setMinimized(false);
            assignment.setSimpleView(true);
            assignment.getTargetRef().setRelation(getNewAssignmentRelation());
            getPageBase().navigateToNext(new PageAssignmentDetails(Model.of(assignment)));
        } else {
            plusIconClicked = false;
        }
    }

    private void targetObjectDetailsPerformed(AssignmentEditorDto assignment, AjaxRequestTarget target) {
        if (assignment.getTargetRef() == null || assignment.getTargetRef().getOid() == null) {
            return;
        }
        if (!plusIconClicked) {
            OperationResult result = new OperationResult(OPERATION_LOAD_OBJECT);
            Task task = getPageBase().createSimpleTask(OPERATION_LOAD_OBJECT);

            //            PageParameters parameters = new PageParameters();
            //            parameters.add(OnePageParameterEncoder.PARAMETER, assignment.getTargetRef().getOid());

            if (AssignmentEditorDtoType.ORG_UNIT.equals(assignment.getType())) {
                PrismObject<OrgType> object = WebModelServiceUtils.loadObject(OrgType.class,
                        assignment.getTargetRef().getOid(), getPageBase(), task, result);
                getPageBase().navigateToNext(new PageOrgUnit(object, false, true));
            } else if (AssignmentEditorDtoType.ROLE.equals(assignment.getType())) {
                PrismObject<RoleType> object = WebModelServiceUtils.loadObject(RoleType.class,
                        assignment.getTargetRef().getOid(), getPageBase(), task, result);
                getPageBase().navigateToNext(new PageRole(object, false, true));
            } else if (AssignmentEditorDtoType.SERVICE.equals(assignment.getType())) {
                PrismObject<ServiceType> object = WebModelServiceUtils.loadObject(ServiceType.class,
                        assignment.getTargetRef().getOid(), getPageBase(), task, result);
                getPageBase().navigateToNext(new PageService(object, false, true));
            }
        } else {
            plusIconClicked = false;
        }
    }

    private boolean isMultiUserRequest() {
        return getRoleCatalogStorage().isMultiUserRequest();
    }

    private RoleCatalogStorage getRoleCatalogStorage() {
        return getPageBase().getSessionStorage().getRoleCatalog();
    }

    private boolean canAssign(AssignmentEditorDto assignment) {
        return assignment.isAssignable();
    }

    private void addAssignmentPerformed(AssignmentEditorDto assignment, AjaxRequestTarget target) {
        plusIconClicked = true;
        RoleCatalogStorage storage = getPageBase().getSessionStorage().getRoleCatalog();
        AssignmentEditorDto dto = assignment.clone();
        dto.getTargetRef().setRelation(getNewAssignmentRelation());
        storage.getAssignmentShoppingCart().add(dto);

        assignmentAddedToShoppingCartPerformed(target);
    }

    protected void assignmentAddedToShoppingCartPerformed(AjaxRequestTarget target) {
    }

    protected QName getNewAssignmentRelation() {
        return WebComponentUtil.getDefaultRelationOrFail();
    }
}