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

Java tutorial

Introduction

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

Source

/*
 * Copyright (c) 2010-2013 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 com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule;
import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer;
import com.evolveum.midpoint.prism.query.*;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.result.OperationResultStatus;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
import com.evolveum.midpoint.task.api.Task;
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.application.AuthorizationAction;
import com.evolveum.midpoint.web.application.PageDescriptor;
import com.evolveum.midpoint.web.component.BasicSearchPanel;
import com.evolveum.midpoint.web.component.data.ObjectDataProvider;
import com.evolveum.midpoint.web.component.data.TablePanel;
import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn;
import com.evolveum.midpoint.web.component.data.column.InlineMenuHeaderColumn;
import com.evolveum.midpoint.web.component.data.column.LinkColumn;
import com.evolveum.midpoint.web.component.dialog.ConfirmationDialog;
import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem;
import com.evolveum.midpoint.web.component.util.LoadableModel;
import com.evolveum.midpoint.web.component.util.SelectableBean;
import com.evolveum.midpoint.web.page.admin.configuration.component.HeaderMenuAction;
import com.evolveum.midpoint.web.page.admin.roles.dto.RolesSearchDto;
import com.evolveum.midpoint.web.session.RolesStorage;
import com.evolveum.midpoint.web.session.UsersStorage;
import com.evolveum.midpoint.web.util.OnePageParameterEncoder;
import com.evolveum.midpoint.web.util.WebMiscUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType;

import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
import org.apache.wicket.markup.html.form.*;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;

import java.util.ArrayList;
import java.util.List;

/**
 * @author lazyman
 */
@PageDescriptor(url = "/admin/roles", action = {
        @AuthorizationAction(actionUri = PageAdminRoles.AUTH_ROLE_ALL, label = PageAdminRoles.AUTH_ROLE_ALL_LABEL, description = PageAdminRoles.AUTH_ROLE_ALL_DESCRIPTION),
        @AuthorizationAction(actionUri = AuthorizationConstants.NS_AUTHORIZATION
                + "#roles", label = "PageRoles.auth.roles.label", description = "PageRoles.auth.roles.description") })
public class PageRoles extends PageAdminRoles {

    private static final Trace LOGGER = TraceManager.getTrace(PageRoles.class);
    private static final String DOT_CLASS = PageRoles.class.getName() + ".";
    private static final String OPERATION_DELETE_ROLES = DOT_CLASS + "deleteRoles";

    private static final String DIALOG_CONFIRM_DELETE = "confirmDeletePopup";
    private static final String ID_TABLE = "table";
    private static final String ID_MAIN_FORM = "mainForm";
    private static final String ID_SEARCH_FORM = "searchForm";
    private static final String ID_BASIC_SEARCH = "basicSearch";
    private static final String ID_SEARCH_REQUESTABLE = "choice";

    private IModel<RolesSearchDto> searchModel;

    public PageRoles() {

        searchModel = new LoadableModel<RolesSearchDto>() {

            @Override
            protected RolesSearchDto load() {
                RolesStorage storage = getSessionStorage().getRoles();
                RolesSearchDto dto = storage.getRolesSearch();

                if (dto == null) {
                    dto = new RolesSearchDto();
                }

                return dto;
            }
        };

        initLayout();
    }

    private void initLayout() {
        Form searchForm = new Form(ID_SEARCH_FORM);
        searchForm.setOutputMarkupId(true);
        add(searchForm);
        initSearchForm(searchForm);

        Form mainForm = new Form(ID_MAIN_FORM);
        add(mainForm);

        ObjectDataProvider provider = new ObjectDataProvider(PageRoles.this, RoleType.class) {

            @Override
            protected void saveProviderPaging(ObjectQuery query, ObjectPaging paging) {
                RolesStorage storage = getSessionStorage().getRoles();
                storage.setRolesPaging(paging);
            }
        };
        provider.setQuery(createQuery());

        List<IColumn<RoleType, String>> columns = initColumns();
        TablePanel table = new TablePanel<>(ID_TABLE, provider, columns);
        table.setOutputMarkupId(true);
        RolesStorage storage = getSessionStorage().getRoles();
        table.setCurrentPage(storage.getRolesPaging());

        mainForm.add(table);

        add(new ConfirmationDialog(DIALOG_CONFIRM_DELETE,
                createStringResource("pageRoles.dialog.title.confirmDelete"), createDeleteConfirmString()) {

            @Override
            public void yesPerformed(AjaxRequestTarget target) {
                close(target);
                deleteConfirmedPerformed(target);
            }
        });
    }

    private void initSearchForm(Form searchForm) {
        DropDownChoice requestable = new DropDownChoice(ID_SEARCH_REQUESTABLE,
                new PropertyModel(searchModel, RolesSearchDto.F_REQUESTABLE),
                WebMiscUtil.createReadonlyModelFromEnum(RolesSearchDto.Requestable.class),
                new EnumChoiceRenderer(this));
        requestable.add(new OnChangeAjaxBehavior() {

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

        searchForm.add(requestable);

        BasicSearchPanel<RolesSearchDto> basicSearch = new BasicSearchPanel<RolesSearchDto>(ID_BASIC_SEARCH) {

            @Override
            protected IModel<String> createSearchTextModel() {
                return new PropertyModel<>(searchModel, RolesSearchDto.F_SEARCH_TEXT);
            }

            @Override
            protected void searchPerformed(AjaxRequestTarget target) {
                listRolesPerformed(target);
            }

            @Override
            protected void clearSearchPerformed(AjaxRequestTarget target) {
                PageRoles.this.clearSearchPerformed(target);
            }
        };
        searchForm.add(basicSearch);
    }

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

        IColumn column = new CheckBoxHeaderColumn<RoleType>();
        columns.add(column);

        column = new LinkColumn<SelectableBean<RoleType>>(createStringResource("ObjectType.name"), "name",
                "value.name") {

            @Override
            public void onClick(AjaxRequestTarget target, IModel<SelectableBean<RoleType>> rowModel) {
                RoleType role = rowModel.getObject().getValue();
                roleDetailsPerformed(target, role.getOid());
            }
        };
        columns.add(column);

        column = new PropertyColumn(createStringResource("ObjectType.description"), "value.description");
        columns.add(column);

        column = new InlineMenuHeaderColumn(initInlineMenu());
        columns.add(column);

        return columns;
    }

    private List<InlineMenuItem> initInlineMenu() {
        List<InlineMenuItem> headerMenuItems = new ArrayList<InlineMenuItem>();
        headerMenuItems.add(new InlineMenuItem(createStringResource("pageRoles.button.delete"), true,
                new HeaderMenuAction(this) {

                    @Override
                    public void onSubmit(AjaxRequestTarget target, Form<?> form) {
                        deletePerformed(target);
                    }
                }));

        return headerMenuItems;
    }

    private IModel<String> createDeleteConfirmString() {
        return new AbstractReadOnlyModel<String>() {

            @Override
            public String getObject() {
                return createStringResource("pageRoles.message.deleteRoleConfirm", getSelectedRoles().size())
                        .getString();
            }
        };
    }

    private TablePanel getRoleTable() {
        return (TablePanel) get(createComponentPath(ID_MAIN_FORM, ID_TABLE));
    }

    private ObjectDataProvider<SelectableBean<RoleType>, RoleType> getRoleDataProvider() {
        DataTable table = getRoleTable().getDataTable();
        return (ObjectDataProvider<SelectableBean<RoleType>, RoleType>) table.getDataProvider();
    }

    private List<RoleType> getSelectedRoles() {
        ObjectDataProvider<SelectableBean<RoleType>, RoleType> provider = getRoleDataProvider();

        List<SelectableBean<RoleType>> rows = provider.getAvailableData();
        List<RoleType> selected = new ArrayList<RoleType>();
        for (SelectableBean<RoleType> row : rows) {
            if (row.isSelected()) {
                selected.add(row.getValue());
            }
        }

        return selected;
    }

    private void deletePerformed(AjaxRequestTarget target) {
        List<RoleType> selected = getSelectedRoles();
        if (selected.isEmpty()) {
            warn(getString("pageRoles.message.nothingSelected"));
            target.add(getFeedbackPanel());
            return;
        }

        ModalWindow dialog = (ModalWindow) get(DIALOG_CONFIRM_DELETE);
        dialog.show(target);
    }

    private void deleteConfirmedPerformed(AjaxRequestTarget target) {
        List<RoleType> selected = getSelectedRoles();

        OperationResult result = new OperationResult(OPERATION_DELETE_ROLES);
        for (RoleType role : selected) {
            try {
                Task task = createSimpleTask(OPERATION_DELETE_ROLES);

                ObjectDelta delta = ObjectDelta.createDeleteDelta(RoleType.class, role.getOid(), getPrismContext());
                getModelService().executeChanges(WebMiscUtil.createDeltaCollection(delta), null, task, result);
            } catch (Exception ex) {
                result.recordPartialError("Couldn't delete role.", ex);
                LoggingUtils.logException(LOGGER, "Couldn't delete role", ex);
            }
        }

        if (result.isUnknown()) {
            result.recomputeStatus("Error occurred during role deleting.");
        }

        if (result.isSuccess()) {
            result.recordStatus(OperationResultStatus.SUCCESS, "The role(s) have been successfully deleted.");
        }

        ObjectDataProvider provider = getRoleDataProvider();
        provider.clearCache();

        showResult(result);
        target.add(getFeedbackPanel());
        target.add(getRoleTable());
    }

    private void roleDetailsPerformed(AjaxRequestTarget target, String oid) {
        PageParameters parameters = new PageParameters();
        parameters.add(OnePageParameterEncoder.PARAMETER, oid);
        setResponsePage(PageRole.class, parameters);
    }

    private void listRolesPerformed(AjaxRequestTarget target) {
        ObjectQuery query = createQuery();
        ObjectDataProvider provider = getRoleDataProvider();
        provider.setQuery(query);

        RolesStorage storage = getSessionStorage().getRoles();
        storage.setRolesSearch(searchModel.getObject());
        storage.setRolesPaging(null);

        TablePanel table = getRoleTable();
        table.setCurrentPage(null);
        target.add(table);
        target.add(getFeedbackPanel());
    }

    private ObjectQuery createQuery() {
        RolesSearchDto dto = searchModel.getObject();
        String text = dto.getText();
        Boolean requestable = dto.getRequestableValue();
        ObjectQuery query = new ObjectQuery();

        if (StringUtils.isNotEmpty(text)) {
            PolyStringNormalizer normalizer = getPrismContext().getDefaultPolyStringNormalizer();
            String normalizedText = normalizer.normalize(text);

            ObjectFilter substring = SubstringFilter.createSubstring(RoleType.F_NAME, RoleType.class,
                    getPrismContext(), PolyStringNormMatchingRule.NAME, normalizedText);

            if (requestable == null) {
                query.setFilter(substring);
            } else {
                EqualFilter boolFilter = EqualFilter.createEqual(RoleType.F_REQUESTABLE, RoleType.class,
                        getPrismContext(), null, requestable);

                if (requestable == true) {
                    query.setFilter(AndFilter.createAnd(substring, boolFilter));

                } else {
                    boolFilter = EqualFilter.createEqual(RoleType.F_REQUESTABLE, RoleType.class, getPrismContext(),
                            null, false);
                    EqualFilter nullFilter = EqualFilter.createEqual(RoleType.F_REQUESTABLE, RoleType.class,
                            getPrismContext(), null, null);
                    OrFilter or = OrFilter.createOr(boolFilter, nullFilter);
                    query.setFilter(AndFilter.createAnd(substring, or));
                }
            }

            return query;
        } else {
            if (requestable == null) {
                query.setFilter(null);
            } else {
                EqualFilter boolFilter = EqualFilter.createEqual(RoleType.F_REQUESTABLE, RoleType.class,
                        getPrismContext(), null, requestable);

                if (requestable == true) {
                    query.setFilter(boolFilter);
                } else {
                    boolFilter = EqualFilter.createEqual(RoleType.F_REQUESTABLE, RoleType.class, getPrismContext(),
                            null, false);
                    EqualFilter nullFilter = EqualFilter.createEqual(RoleType.F_REQUESTABLE, RoleType.class,
                            getPrismContext(), null, null);

                    OrFilter or = OrFilter.createOr(boolFilter, nullFilter);
                    query.setFilter(or);
                }
            }
            return query;
        }
    }

    private void clearSearchPerformed(AjaxRequestTarget target) {
        searchModel.setObject(new RolesSearchDto());

        TablePanel panel = getRoleTable();
        DataTable table = panel.getDataTable();
        ObjectDataProvider provider = (ObjectDataProvider) table.getDataProvider();
        provider.setQuery(null);

        RolesStorage storage = getSessionStorage().getRoles();
        storage.setRolesSearch(searchModel.getObject());
        storage.setRolesPaging(null);

        panel.setCurrentPage(storage.getRolesPaging());

        target.add(get(ID_SEARCH_FORM));
        target.add(panel);
    }
}