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

Java tutorial

Introduction

Here is the source code for com.evolveum.midpoint.web.component.assignment.SimpleRoleSelector.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 java.util.Iterator;
import java.util.List;

import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;

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.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType;

/**
 * @author semancik
 */
public class SimpleRoleSelector<F extends FocusType, R extends AbstractRoleType>
        extends BasePanel<List<AssignmentEditorDto>> {
    private static final long serialVersionUID = 1L;

    private static final Trace LOGGER = TraceManager.getTrace(SimpleRoleSelector.class);

    private static final String ID_LIST = "list";
    private static final String ID_ITEM = "item";
    private static final String ID_BUTTON_RESET = "buttonReset";

    List<PrismObject<R>> availableRoles;

    public SimpleRoleSelector(String id, IModel<List<AssignmentEditorDto>> assignmentModel,
            List<PrismObject<R>> availableRoles) {
        super(id, assignmentModel);
        this.availableRoles = availableRoles;
        initLayout();
    }

    public List<AssignmentType> getAssignmentTypeList() {
        return null;
    }

    public String getExcludeOid() {
        return null;
    }

    protected IModel<List<AssignmentEditorDto>> getAssignmentModel() {
        return getModel();
    }

    private void initLayout() {
        setOutputMarkupId(true);
        ListView<PrismObject<R>> list = new ListView<PrismObject<R>>(ID_LIST, availableRoles) {
            @Override
            protected void populateItem(ListItem<PrismObject<R>> item) {
                item.add(createRoleLink(ID_ITEM, item.getModel()));
            }
        };
        list.setOutputMarkupId(true);
        add(list);

        AjaxLink<String> buttonReset = new AjaxLink<String>(ID_BUTTON_RESET) {
            @Override
            public void onClick(AjaxRequestTarget target) {
                reset();
                target.add(SimpleRoleSelector.this);
            }
        };
        buttonReset.setBody(createStringResource("SimpleRoleSelector.reset"));
        add(buttonReset);
    }

    private Component createRoleLink(String id, IModel<PrismObject<R>> model) {
        AjaxLink<PrismObject<R>> button = new AjaxLink<PrismObject<R>>(id, model) {

            @Override
            public IModel<?> getBody() {
                return new Model<String>(getModel().getObject().asObjectable().getName().getOrig());
            }

            @Override
            public void onClick(AjaxRequestTarget target) {
                LOGGER.trace("{} CLICK: {}", this, getModel().getObject());
                toggleRole(getModel().getObject());
                target.add(this);
            }

            @Override
            protected void onComponentTag(ComponentTag tag) {
                super.onComponentTag(tag);
                PrismObject<R> role = getModel().getObject();
                if (isSelected(role)) {
                    tag.put("class", "list-group-item active");
                } else {
                    tag.put("class", "list-group-item");
                }
                String description = role.asObjectable().getDescription();
                if (description != null) {
                    tag.put("title", description);
                }
            }
        };
        button.setOutputMarkupId(true);
        return button;
    }

    private boolean isSelected(PrismObject<R> role) {
        for (AssignmentEditorDto dto : getAssignmentModel().getObject()) {
            if (willProcessAssignment(dto)) {
                if (dto.getTargetRef() != null && role.getOid().equals(dto.getTargetRef().getOid())) {
                    if (dto.getStatus() != UserDtoStatus.DELETE) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    private void toggleRole(PrismObject<R> role) {
        Iterator<AssignmentEditorDto> iterator = getAssignmentModel().getObject().iterator();
        while (iterator.hasNext()) {
            AssignmentEditorDto dto = iterator.next();
            if (willProcessAssignment(dto)) {
                if (dto.getTargetRef() != null && role.getOid().equals(dto.getTargetRef().getOid())) {
                    if (dto.getStatus() == UserDtoStatus.ADD) {
                        iterator.remove();
                    } else {
                        dto.setStatus(UserDtoStatus.DELETE);
                    }
                    return;
                }
            }
        }

        AssignmentEditorDto dto = createAddAssignmentDto(role, getPageBase());
        getAssignmentModel().getObject().add(dto);
    }

    protected AssignmentEditorDto createAddAssignmentDto(PrismObject<R> role, PageBase pageBase) {
        AssignmentEditorDto dto = AssignmentEditorDto.createDtoAddFromSelectedObject(role.asObjectable(),
                getPageBase());
        dto.setMinimized(true);
        return dto;
    }

    private void reset() {
        Iterator<AssignmentEditorDto> iterator = getAssignmentModel().getObject().iterator();
        while (iterator.hasNext()) {
            AssignmentEditorDto dto = iterator.next();
            if (isManagedRole(dto) && willProcessAssignment(dto)) {
                if (dto.getStatus() == UserDtoStatus.ADD) {
                    iterator.remove();
                } else if (dto.getStatus() == UserDtoStatus.DELETE) {
                    dto.setStatus(UserDtoStatus.MODIFY);
                }
            }
        }
    }

    protected boolean willProcessAssignment(AssignmentEditorDto dto) {
        return true;
    }

    protected boolean isManagedRole(AssignmentEditorDto dto) {
        if (dto.getTargetRef() == null || dto.getTargetRef().getOid() == null) {
            return false;
        }
        for (PrismObject<R> availableRole : availableRoles) {
            if (availableRole.getOid().equals(dto.getTargetRef().getOid())) {
                return true;
            }
        }
        return false;
    }

}