com.evolveum.midpoint.web.page.admin.roles.RoleMemberPanel.java Source code

Java tutorial

Introduction

Here is the source code for com.evolveum.midpoint.web.page.admin.roles.RoleMemberPanel.java

Source

/*
 * Copyright (c) 2015-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.page.admin.roles;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.xml.namespace.QName;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;

import com.evolveum.midpoint.gui.api.component.MainObjectListPanel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.query.AndFilter;
import com.evolveum.midpoint.prism.query.EqualFilter;
import com.evolveum.midpoint.prism.query.InOidFilter;
import com.evolveum.midpoint.prism.query.NotFilter;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.OrFilter;
import com.evolveum.midpoint.prism.query.RefFilter;
import com.evolveum.midpoint.prism.query.TypeFilter;
import com.evolveum.midpoint.schema.constants.ObjectTypes;
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.task.api.TaskCategory;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.logging.LoggingUtils;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.data.column.CheckBoxPanel;
import com.evolveum.midpoint.web.component.input.ObjectTypeChoiceRenderer;
import com.evolveum.midpoint.web.component.input.QNameChoiceRenderer;
import com.evolveum.midpoint.web.page.admin.users.component.AbstractRoleMemberPanel;
import com.evolveum.midpoint.web.session.UserProfileStorage.TableId;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType;
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.RoleType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;

public class RoleMemberPanel extends AbstractRoleMemberPanel<RoleType> {

    private static final long serialVersionUID = 1L;

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

    private static String ID_OBJECT_TYPE = "type";
    private static String ID_TENANT = "tenant";
    private static String ID_PROJECT = "project";
    private static String ID_INDIRECT_MEMBERS = "indirectMembers";

    public RoleMemberPanel(String id, IModel<RoleType> model, PageBase pageBase) {
        super(id, TableId.ROLE_MEMEBER_PANEL, model, pageBase);

    }

    private PrismContext getPrismContext() {
        return getPageBase().getPrismContext();
    }

    private <V> DropDownChoice<V> createDropDown(String id, IModel<V> defaultModel, final List<V> values,
            IChoiceRenderer<V> renderer) {
        DropDownChoice<V> listSelect = new DropDownChoice<V>(id, defaultModel,
                new AbstractReadOnlyModel<List<V>>() {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public List<V> getObject() {
                        return values;
                    }
                }, renderer);

        listSelect.add(new OnChangeAjaxBehavior() {
            private static final long serialVersionUID = 1L;

            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                refreshTable(target);
            }
        });

        return listSelect;
    }

    protected void refreshTable(AjaxRequestTarget target) {
        DropDownChoice<QName> typeChoice = (DropDownChoice) get(createComponentPath(ID_OBJECT_TYPE));
        QName type = typeChoice.getModelObject();
        getMemberTable().clearCache();
        getMemberTable().refreshTable((Class<FocusType>) WebComponentUtil.qnameToClass(getPrismContext(), type),
                target);
    }

    private List<OrgType> createTenantList() {
        ObjectQuery query;
        try {
            query = ObjectQuery.createObjectQuery(
                    EqualFilter.createEqual(OrgType.F_TENANT, OrgType.class, getPrismContext(), true));
            List<PrismObject<OrgType>> orgs = WebModelServiceUtils.searchObjects(OrgType.class, query,
                    new OperationResult("Tenant search"), getPageBase());
            List<OrgType> orgTypes = new ArrayList<>();
            for (PrismObject<OrgType> org : orgs) {
                orgTypes.add(org.asObjectable());
            }

            return orgTypes;
        } catch (SchemaException e) {
            error(getString("pageUsers.message.queryError") + " " + e.getMessage());
            return null;
        }

    }

    private List<OrgType> createProjectList() {
        ObjectQuery query;
        try {
            query = ObjectQuery.createObjectQuery(OrFilter.createOr(
                    EqualFilter.createEqual(OrgType.F_TENANT, OrgType.class, getPrismContext(), true),
                    EqualFilter.createEqual(OrgType.F_TENANT, OrgType.class, getPrismContext(), null)));
            List<PrismObject<OrgType>> orgs = WebModelServiceUtils.searchObjects(OrgType.class, query,
                    new OperationResult("Tenant search"), getPageBase());
            List<OrgType> orgTypes = new ArrayList<>();
            for (PrismObject<OrgType> org : orgs) {
                orgTypes.add(org.asObjectable());
            }

            return orgTypes;
        } catch (SchemaException e) {
            error(getString("pageUsers.message.queryError") + " " + e.getMessage());
            return null;
        }

    }

    private MainObjectListPanel<FocusType> getMemberTable() {
        return (MainObjectListPanel<FocusType>) get(
                createComponentPath(ID_FORM, ID_CONTAINER_MEMBER, ID_MEMBER_TABLE));
    }

    private AssignmentType createAssignmentToModify() throws SchemaException {
        AssignmentType assignmentToModify = createAssignmentToModify(null);

        DropDownChoice<OrgType> tenantChoice = (DropDownChoice<OrgType>) get(ID_TENANT);
        OrgType tenant = tenantChoice.getModelObject();
        if (tenant != null) {
            assignmentToModify.setTenantRef(ObjectTypeUtil.createObjectRef(tenant.getOid(), ObjectTypes.ORG));
        }
        DropDownChoice<OrgType> projectChoice = (DropDownChoice<OrgType>) get(ID_PROJECT);
        OrgType project = projectChoice.getModelObject();
        if (project != null) {
            assignmentToModify.setOrgRef(ObjectTypeUtil.createObjectRef(project.getOid(), ObjectTypes.ORG));
        }

        return assignmentToModify;
    }

    private ObjectQuery getActionQuery(QueryScope scope) {
        switch (scope) {
        case ALL:
            return createAllMemberQuery();
        case ALL_DIRECT:
            return createDirectMemberQuery();
        case SELECTED:
            return createRecomputeQuery();
        }

        return null;
    }

    private ObjectQuery createAllMemberQuery() {
        return ObjectQuery.createObjectQuery(
                RefFilter.createReferenceEqual(FocusType.F_ROLE_MEMBERSHIP_REF, FocusType.class, getModelObject()));
    }

    private ObjectQuery createRecomputeQuery() {
        Set<String> oids = getFocusOidToRecompute();
        ObjectQuery query = ObjectQuery.createObjectQuery(InOidFilter.createInOid(oids));
        return query;
    }

    private Set<String> getFocusOidToRecompute() {
        List<FocusType> availableData = getMemberTable().getSelectedObjects();
        Set<String> oids = new HashSet<>();
        for (FocusType focus : availableData) {
            oids.add(focus.getOid());

        }
        return oids;
    }

    @Override
    protected void initCustomLayout(Form form) {

    }

    @Override
    protected void initSearch(Form form) {
        List<QName> allowedTypes = WebComponentUtil.createFocusTypeList();
        allowedTypes.add(FocusType.COMPLEX_TYPE);
        DropDownChoice<QName> typeSelect = createDropDown(ID_OBJECT_TYPE, Model.of(FocusType.COMPLEX_TYPE),
                allowedTypes, new QNameChoiceRenderer());
        add(typeSelect);

        DropDownChoice<OrgType> tenant = createDropDown(ID_TENANT, new Model(), createTenantList(),
                new ObjectTypeChoiceRenderer<OrgType>());
        add(tenant);

        DropDownChoice<OrgType> project = createDropDown(ID_PROJECT, new Model(), createProjectList(),
                new ObjectTypeChoiceRenderer<OrgType>());
        add(project);

        CheckBoxPanel includeIndirectMembers = new CheckBoxPanel(ID_INDIRECT_MEMBERS, new Model<Boolean>(false)) {
            private static final long serialVersionUID = 1L;

            public void onUpdate(AjaxRequestTarget target) {
                refreshTable(target);
            };
        };
        add(includeIndirectMembers);

    }

    @Override
    protected void addMembersPerformed(QName type, QName relation, List selected, AjaxRequestTarget target) {
        Task operationalTask = getPageBase().createSimpleTask(getTaskName("Add", null));
        ObjectDelta delta = prepareDelta(type, MemberOperation.ADD, operationalTask.getResult());
        executeMemberOperation(operationalTask, type, createQueryForAdd(selected), delta,
                TaskCategory.EXECUTE_CHANGES, target);

    }

    private ObjectDelta prepareDelta(QName type, MemberOperation operation, OperationResult result) {
        Class classType = WebComponentUtil.qnameToClass(getPrismContext(), type);
        ObjectDelta delta = null;
        try {
            switch (operation) {
            case ADD:

                delta = ObjectDelta.createModificationAddContainer(classType, "fakeOid", FocusType.F_ASSIGNMENT,
                        getPrismContext(), createAssignmentToModify());

                break;

            case REMOVE:
                delta = ObjectDelta.createModificationDeleteContainer(classType, "fakeOid", FocusType.F_ASSIGNMENT,
                        getPrismContext(), createAssignmentToModify());
                break;
            }
        } catch (SchemaException e) {
            LoggingUtils.logUnexpectedException(LOGGER, "Failed to prepare delta for operation " + operation.name(),
                    e);
            result.recordFatalError("Failed to prepare delta for operation " + operation.name(), e);
        }
        return delta;
    }

    @Override
    protected void removeMembersPerformed(QueryScope scope, AjaxRequestTarget target) {
        Task operationalTask = getPageBase().createSimpleTask(getTaskName("Remove", scope));
        ObjectDelta delta = prepareDelta(FocusType.COMPLEX_TYPE, MemberOperation.REMOVE,
                operationalTask.getResult());
        executeMemberOperation(operationalTask, FocusType.COMPLEX_TYPE, getActionQuery(scope), delta,
                TaskCategory.EXECUTE_CHANGES, target);

    }

    @Override
    protected void recomputeMembersPerformed(QueryScope scope, AjaxRequestTarget target) {
        Task operationalTask = getPageBase().createSimpleTask(getTaskName("Recompute", scope));
        executeMemberOperation(operationalTask, FocusType.COMPLEX_TYPE, getActionQuery(scope), null,
                TaskCategory.RECOMPUTATION, target);

    }

    @Override
    protected ObjectQuery createMemberQuery() {
        CheckBoxPanel indirectMembers = (CheckBoxPanel) get(createComponentPath(ID_INDIRECT_MEMBERS));
        boolean indirect = indirectMembers.getValue();
        return indirect ? createAllMemberQuery() : createDirectMemberQuery();

    }

    private ObjectQuery createDirectMemberQuery() {
        ObjectQuery query = null;

        String oid = getModelObject().getOid();

        List<ObjectFilter> filters = new ArrayList<>();
        try {
            filters.add(RefFilter.createReferenceEqual(
                    new ItemPath(FocusType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF), UserType.class,
                    getPrismContext(), createReference().asReferenceValue()));

            DropDownChoice<OrgType> tenantChoice = (DropDownChoice) get(createComponentPath(ID_TENANT));
            OrgType tenant = tenantChoice.getModelObject();

            if (tenant != null) {
                filters.add(RefFilter.createReferenceEqual(
                        new ItemPath(FocusType.F_ASSIGNMENT, AssignmentType.F_TENANT_REF), UserType.class,
                        getPrismContext(), createReference(tenant).asReferenceValue()));
            }

            DropDownChoice<OrgType> projectChoice = (DropDownChoice) get(createComponentPath(ID_PROJECT));
            OrgType project = projectChoice.getModelObject();

            if (project != null) {
                filters.add(RefFilter.createReferenceEqual(
                        new ItemPath(FocusType.F_ASSIGNMENT, AssignmentType.F_ORG_REF), UserType.class,
                        getPrismContext(), createReference(project).asReferenceValue()));
            }

            query = ObjectQuery.createObjectQuery(AndFilter.createAnd(filters));

            if (LOGGER.isTraceEnabled()) {
                LOGGER.trace("Searching members of role {} with query:\n{}", oid, query.debugDump());
            }

        } catch (SchemaException e) {
            LoggingUtils.logUnexpectedException(LOGGER, "Couldn't prepare query for org. members.", e);
        }

        DropDownChoice<QName> objectTypeChoice = (DropDownChoice) get(createComponentPath(ID_OBJECT_TYPE));
        QName objectType = objectTypeChoice.getModelObject();
        if (objectType == null || FocusType.COMPLEX_TYPE.equals(objectType)) {
            return query;
        }

        return ObjectQuery.createObjectQuery(TypeFilter.createType(objectType, query.getFilter()));
    }
}