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

Java tutorial

Introduction

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

Source

/**
 * Copyright (c) 2015-2018 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.component.BasePanel;
import com.evolveum.midpoint.gui.api.component.form.CheckBoxPanel;
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.prism.query.ObjectQuery;
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.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.prism.*;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.basic.Label;
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 java.util.Collections;
import java.util.Comparator;
import java.util.List;

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

    private static final Trace LOGGER = TraceManager.getTrace(ApplicablePolicyGroupPanel.class);
    private static final String DOT_CLASS = ApplicablePolicyGroupPanel.class.getName() + ".";
    private static final String OPERATION_LOAD_POLICY_GROUP_MEMBERS = DOT_CLASS + "loadPolicyGroupMembers";
    private static final String OPERATION_LOAD_POLICY_GROUP_NAME = DOT_CLASS + "loadPolicyGroupName";

    private static final String ID_POLICY_GROUP_NAME = "policyGroupName";
    private static final String ID_POLICIES_CONTAINER = "policiesContainer";
    private static final String ID_POLICY_CHECK_BOX = "policyCheckBox";
    private LoadableModel<List<PrismObject<AbstractRoleType>>> policiesListModel;
    IModel<ContainerWrapper<AssignmentType>> assignmentsModel;

    public ApplicablePolicyGroupPanel(String id, IModel<ObjectReferenceType> model,
            IModel<ContainerWrapper<AssignmentType>> assignmentsModel) {
        super(id, model);
        this.assignmentsModel = assignmentsModel;
    }

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

    private void initModels() {
        policiesListModel = new LoadableModel<List<PrismObject<AbstractRoleType>>>(false) {
            @Override
            protected List<PrismObject<AbstractRoleType>> load() {
                OperationResult result = new OperationResult(OPERATION_LOAD_POLICY_GROUP_MEMBERS);

                ObjectReferenceType policyGroupObject = ApplicablePolicyGroupPanel.this.getModelObject();
                ObjectQuery membersQuery = getPageBase().getPrismContext().queryFor(AbstractRoleType.class)
                        .isChildOf(policyGroupObject.getOid()).build();
                List<PrismObject<AbstractRoleType>> policiesList = WebModelServiceUtils
                        .searchObjects(AbstractRoleType.class, membersQuery, result, getPageBase());
                Collections.sort(policiesList, new Comparator<PrismObject<AbstractRoleType>>() {
                    @Override
                    public int compare(PrismObject<AbstractRoleType> o1, PrismObject<AbstractRoleType> o2) {
                        String displayName1 = WebComponentUtil.getDisplayNameOrName(o1);
                        String displayName2 = WebComponentUtil.getDisplayNameOrName(o2);
                        return String.CASE_INSENSITIVE_ORDER.compare(displayName1, displayName2);
                    }
                });
                return policiesList;
            }
        };
    }

    private void initLayout() {
        Label policyGroupName = new Label(ID_POLICY_GROUP_NAME, Model.of(WebComponentUtil
                .getDisplayNameOrName(getModelObject(), getPageBase(), OPERATION_LOAD_POLICY_GROUP_NAME)));
        policyGroupName.setOutputMarkupId(true);
        add(policyGroupName);

        ListView<PrismObject<AbstractRoleType>> policiesPanel = new ListView<PrismObject<AbstractRoleType>>(
                ID_POLICIES_CONTAINER, policiesListModel) {
            private static final long serialVersionUID = 1L;

            @Override
            protected void populateItem(ListItem<PrismObject<AbstractRoleType>> listItem) {
                PrismObject<AbstractRoleType> abstractRole = listItem.getModelObject();
                CheckBoxPanel policyCheckBox = new CheckBoxPanel(ID_POLICY_CHECK_BOX,
                        getCheckboxModel(abstractRole), null, // visibility
                        Model.of(WebComponentUtil.getDisplayNameOrName(abstractRole)), // label
                        null // tooltip
                ) {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public void onUpdate(AjaxRequestTarget target) {
                        onPolicyAddedOrRemoved(listItem.getModelObject(), getValue());
                    }
                };
                policyCheckBox.setOutputMarkupId(true);
                listItem.add(policyCheckBox);
            }
        };
        policiesPanel.setOutputMarkupId(true);
        add(policiesPanel);
    }

    private IModel<Boolean> getCheckboxModel(PrismObject<AbstractRoleType> abstractRole) {
        return Model.of(isAssignmentAlreadyInList(abstractRole.getOid())
                && !ValueStatus.DELETED.equals(getExistingAssignmentStatus(abstractRole.getOid())));
    }

    private boolean isAssignmentAlreadyInList(String policyRoleOid) {
        for (ContainerValueWrapper<AssignmentType> assignment : assignmentsModel.getObject().getValues()) {
            ObjectReferenceType targetRef = assignment.getContainerValue().getValue().getTargetRef();
            if (targetRef != null && targetRef.getOid().equals(policyRoleOid)) {
                return true;
            }
        }
        return false;
    }

    private ValueStatus getExistingAssignmentStatus(String policyRoleOid) {
        for (ContainerValueWrapper<AssignmentType> assignment : assignmentsModel.getObject().getValues()) {
            ObjectReferenceType targetRef = assignment.getContainerValue().getValue().getTargetRef();
            if (targetRef != null && targetRef.getOid().equals(policyRoleOid)) {
                return assignment.getStatus();
            }
        }
        return null;
    }

    private void onPolicyAddedOrRemoved(PrismObject<AbstractRoleType> assignmentTargetObject, boolean added) {
        if (isAssignmentAlreadyInList(assignmentTargetObject.getOid())) {
            ContainerValueWrapper<AssignmentType> assignmentToRemove = null;
            for (ContainerValueWrapper<AssignmentType> assignment : assignmentsModel.getObject().getValues()) {
                ObjectReferenceType targetRef = assignment.getContainerValue().getValue().getTargetRef();
                if (targetRef != null && targetRef.getOid().equals(assignmentTargetObject.getOid())) {
                    if (added && assignment.getStatus() == ValueStatus.DELETED) {
                        assignment.setStatus(ValueStatus.NOT_CHANGED);
                    } else if (!added && assignment.getStatus() == ValueStatus.ADDED) {
                        assignmentToRemove = assignment;
                    } else if (!added) {
                        assignment.setStatus(ValueStatus.DELETED);
                    }
                }
            }
            assignmentsModel.getObject().getValues().remove(assignmentToRemove);
        } else {
            if (added) {
                //TODO: not sure if this is correct way of creating new value.. this value is added directly to the origin object... what about deltas??
                PrismContainerValue<AssignmentType> newAssignment = assignmentsModel.getObject().getItem()
                        .createNewValue();
                ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(assignmentTargetObject,
                        getPageBase().getPrismContext());
                AssignmentType assignmentType = newAssignment.asContainerable();
                assignmentType.setTargetRef(ref);
                Task task = getPageBase().createSimpleTask("Creating new applicable policy");
                ContainerWrapperFactory factory = new ContainerWrapperFactory(getPageBase());
                ContainerValueWrapper<AssignmentType> valueWrapper = factory.createContainerValueWrapper(
                        assignmentsModel.getObject(), newAssignment, assignmentsModel.getObject().getObjectStatus(),
                        ValueStatus.ADDED, assignmentsModel.getObject().getPath(), task);
                valueWrapper.setShowEmpty(true, false);
                assignmentsModel.getObject().getValues().add(valueWrapper);
            }
        }
    }
}