org.pentaho.mantle.client.solutionbrowser.fileproperties.SelectUserOrRoleDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.mantle.client.solutionbrowser.fileproperties.SelectUserOrRoleDialog.java

Source

/*!
 * This program is free software; you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
 * Foundation.
 *
 * You should have received a copy of the GNU Lesser General Public License along with this
 * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
 * or from the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Lesser General Public License for more details.
 *
 * Copyright (c) 2002-2013 Pentaho Corporation..  All rights reserved.
 */

package org.pentaho.mantle.client.solutionbrowser.fileproperties;

import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JsArrayString;
import com.google.gwt.core.client.JsonUtils;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.xml.client.Document;

import org.pentaho.gwt.widgets.client.dialogs.IDialogCallback;
import org.pentaho.gwt.widgets.client.dialogs.MessageDialogBox;
import org.pentaho.gwt.widgets.client.dialogs.PromptDialogBox;
import org.pentaho.mantle.client.messages.Messages;
import org.pentaho.mantle.client.solutionbrowser.fileproperties.PermissionsPanel;

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

public class SelectUserOrRoleDialog extends PromptDialogBox {

    private static FlexTable contentTable = new FlexTable();
    private static ListBox usersListBox = new ListBox(true);
    private static ListBox rolesListBox = new ListBox(true);

    public SelectUserOrRoleDialog(final Document fileInfo, ArrayList<String> existing,
            final IUserRoleSelectedCallback callback) {
        super(Messages.getString("selectUserOrRole"), Messages.getString("ok"), Messages.getString("cancel"), false, //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
                true, contentTable);
        usersListBox.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                rolesListBox.setSelectedIndex(-1);
                okButton.setEnabled(true);
            }
        });
        rolesListBox.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                usersListBox.setSelectedIndex(-1);
                okButton.setEnabled(true);
            }
        });

        setCallback(new IDialogCallback() {

            public void cancelPressed() {
            }

            public void okPressed() {
                for (String selectedUser : getSelectedItemsText(usersListBox)) {
                    callback.userSelected(selectedUser);
                }

                for (String selectedRole : getSelectedItemsText(rolesListBox)) {
                    callback.roleSelected(selectedRole);
                }
            }
        });

        // Unique ids are important for test automation
        contentTable.getElement().setId("userOrRoleDialogContentTable");
        usersListBox.getElement().setId("userOrRoleDialogUsersList");
        rolesListBox.getElement().setId("userOrRoleDialogRolesList");
        okButton.getElement().setId("userOrRoleDialogOkButton");
        okButton.setEnabled(false);
        cancelButton.getElement().setId("userOrRoleDialogCancelButton");

        usersListBox.setVisibleItemCount(5);
        rolesListBox.setVisibleItemCount(5);
        rolesListBox.setWidth("400px");
        rolesListBox.setHeight("200px");
        usersListBox.setWidth("400px");
        usersListBox.setHeight("200px");
        contentTable.clear();
        contentTable.setWidth("100%"); //$NON-NLS-1$
        contentTable.setWidget(0, 0, new Label(Messages.getString("users"))); //$NON-NLS-1$
        contentTable.setWidget(1, 0, usersListBox);
        contentTable.setWidget(2, 0, new Label(Messages.getString("roles"))); //$NON-NLS-1$
        contentTable.setWidget(3, 0, rolesListBox);
        fetchAllUsers(existing, fileInfo);
        fetchAllRoles(existing, fileInfo);
        setWidth("200px"); //$NON-NLS-1$
    }

    public void fetchAllRoles(final ArrayList<String> existing, final Document fileInfo) {

        try {
            final String url = GWT.getHostPageBaseURL() + "api/userrolelist/permission-roles"; //$NON-NLS-1$
            RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.GET, url);
            // This header is required to force Internet Explorer to not cache values from the GET response.
            requestBuilder.setHeader("If-Modified-Since", "01 Jan 1970 00:00:00 GMT");
            requestBuilder.setHeader("accept", "application/json");
            requestBuilder.sendRequest(null, new RequestCallback() {

                public void onError(Request request, Throwable caught) {
                    MessageDialogBox dialogBox = new MessageDialogBox(Messages.getString("error"), //$NON-NLS-1$
                            Messages.getString("couldNotGetRoles"), false, false, true); //$NON-NLS-1$
                    dialogBox.center();
                }

                public void onResponseReceived(Request request, Response response) {
                    JsArrayString roles = parseRolesJson(JsonUtils.escapeJsonForEval(response.getText()));
                    // filter out existing
                    rolesListBox.clear();
                    PermissionsPanel permPanel = new PermissionsPanel(null);
                    for (int i = 0; i < roles.length(); i++) {
                        String role = roles.get(i);
                        if (!existing.contains(role)) {
                            rolesListBox.addItem(role);
                        } else {
                            if (!permPanel.getNames(fileInfo, 1).contains(role)
                                    && permPanel.getNames(fileInfo, 0).contains(role)) {
                                //we have equal user/role pair(s) and user already in existing list
                                rolesListBox.addItem(role);
                            }
                        }
                    }

                }

            });
        } catch (RequestException e) {
            Window.alert(e.getMessage());
        }
    }

    private final native JsArrayString parseUsersJson(String json)
    /*-{
      var obj = JSON.parse(json);
      return obj.users;
    }-*/;

    private final native JsArrayString parseRolesJson(String json)
    /*-{
      var obj = JSON.parse(json);
      return obj.roles;
    }-*/;

    public void fetchAllUsers(final ArrayList<String> existing, final Document fileInfo) {
        try {
            final String url = GWT.getHostPageBaseURL() + "api/userrolelist/permission-users"; //$NON-NLS-1$
            RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.GET, url);
            // This header is required to force Internet Explorer to not cache values from the GET response.
            requestBuilder.setHeader("If-Modified-Since", "01 Jan 1970 00:00:00 GMT");
            requestBuilder.setHeader("accept", "application/json");
            requestBuilder.sendRequest(null, new RequestCallback() {

                public void onError(Request request, Throwable caught) {
                    MessageDialogBox dialogBox = new MessageDialogBox(Messages.getString("error"), //$NON-NLS-1$
                            Messages.getString("couldNotGetUsers"), false, false, true); //$NON-NLS-1$
                    dialogBox.center();
                }

                public void onResponseReceived(Request request, Response response) {
                    JsArrayString users = parseUsersJson(JsonUtils.escapeJsonForEval(response.getText()));
                    // filter out existing
                    usersListBox.clear();
                    PermissionsPanel permPanel = new PermissionsPanel(null);
                    for (int i = 0; i < users.length(); i++) {
                        String user = users.get(i);
                        if (!existing.contains(user)) {
                            usersListBox.addItem(user);
                        } else {
                            if (!permPanel.getNames(fileInfo, 0).contains(user)
                                    && permPanel.getNames(fileInfo, 1).contains(user)) {
                                //we have equal user/role pair(s) and role already in existing list
                                usersListBox.addItem(user);
                            }
                        }
                    }
                }

            });
        } catch (RequestException e) {
            Window.alert(e.getMessage());
        }
    }

    public static String getSelectedUser() {
        if (usersListBox.getSelectedIndex() >= 0) {
            return usersListBox.getItemText(usersListBox.getSelectedIndex());
        }
        return null;
    }

    public static List<String> getSelectedItemsText(ListBox listBox) {
        List<String> selectedItems = new ArrayList<String>();
        for (int i = 0; i < listBox.getItemCount(); i++) {
            if (listBox.isItemSelected(i)) {
                selectedItems.add(listBox.getItemText(i));
            }
        }

        return selectedItems;
    }

    public static List<String> getSelectedItemsValue(ListBox listBox) {
        List<String> selectedItems = new ArrayList<String>();
        for (int i = 0; i < listBox.getItemCount(); i++) {
            if (listBox.isItemSelected(i)) {
                selectedItems.add(listBox.getValue(i));
            }
        }

        return selectedItems;
    }

    public static String getSelectedRole() {
        if (rolesListBox.getSelectedIndex() >= 0) {
            return rolesListBox.getItemText(rolesListBox.getSelectedIndex());
        }
        return null;
    }

}