<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">/*
 * 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 2008 - 2009 Pentaho Corporation.  All rights reserved.
*/
package org.pentaho.pac.client.roles;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.pentaho.gwt.widgets.client.buttons.ImageButton;
import org.pentaho.gwt.widgets.client.dialogs.PromptDialogBox;
import org.pentaho.gwt.widgets.client.ui.ICallback;
import org.pentaho.pac.client.PentahoAdminConsole;
import org.pentaho.pac.client.UserAndRoleMgmtService;
import org.pentaho.pac.client.common.ui.IListBoxFilter;
import org.pentaho.pac.client.common.ui.dialog.ConfirmDialog;
import org.pentaho.pac.client.common.ui.dialog.MessageDialog;
import org.pentaho.pac.client.i18n.Messages;
import org.pentaho.pac.client.users.UserAssignmentsDialogBox;
import org.pentaho.pac.client.users.UsersList;
import org.pentaho.pac.client.utils.ExceptionParser;
import org.pentaho.pac.common.roles.ProxyPentahoRole;
import org.pentaho.pac.common.users.ProxyPentahoUser;

import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ChangeListener;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.KeyboardListener;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PopupListener;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

public class RolesPanel extends DockPanel implements ClickListener, ChangeListener, PopupListener, KeyboardListener {

  class RoleNameFilter implements IListBoxFilter {
    String roleNameFilter;
    
    RoleNameFilter(String roleNameFilter) {
      this.roleNameFilter = roleNameFilter;
    }
    
    public boolean accepts(Object object) {
      boolean result = false;
      if (object instanceof ProxyPentahoRole) {
        String roleName = ((ProxyPentahoRole)object).getName();
        result = ((roleNameFilter == null) || (roleNameFilter.length() == 0));
        if (!result) {
          int filterLen = roleNameFilter.length();
          result = ( filterLen &lt;= roleName.length() )
            &amp;&amp; roleNameFilter.toLowerCase().substring( 0, filterLen )
              .equals( roleName.toLowerCase().substring( 0, filterLen ) ); 
        }
      }
      return result;
    }  
  }
  
  
  HTML errorMsgHtml = new HTML();
  PromptDialogBox errorDialog = new PromptDialogBox(Messages.getString("error"), Messages.getString("ok"), null, false, true, errorMsgHtml); //$NON-NLS-1$ //$NON-NLS-2$
  RolesList rolesList = new RolesList(true);
  UsersList assignedUsersList = new UsersList(true);
  RoleDetailsPanel roleDetailsPanel = new RoleDetailsPanel();
  Button updateRoleBtn = new Button(Messages.getString("update")); //$NON-NLS-1$
  ImageButton addRoleBtn = new ImageButton("style/images/add.png", "style/images/add_disabled.png", Messages.getString("addRole"), 15, 15); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  ImageButton deleteRoleBtn = new ImageButton("style/images/remove.png", "style/images/remove_disabled.png", Messages.getString("deleteRoles"), 15, 15); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
  ImageButton addRoleAssignmentBtn = new ImageButton("style/images/add.png", "style/images/add_disabled.png", Messages.getString("assignRoles"), 15, 15); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
  ImageButton deleteRoleAssignmentBtn = new ImageButton("style/images/remove.png", "style/images/remove_disabled.png", Messages.getString("unassignRoles"), 15, 15); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  TextBox filterTextBox = new TextBox();
  NewRoleDialogBox newRoleDialogBox = new NewRoleDialogBox();
  ConfirmDialog confirmDeleteRolesDialog = new ConfirmDialog();
  ConfirmDialog confirmRemoveRoleAssignmentDialog = new ConfirmDialog();
  
  UserAssignmentsDialogBox userAssignmentsDialog = new UserAssignmentsDialogBox();
  
  @SuppressWarnings("unchecked")
	public RolesPanel() {
	  DockPanel roleListPanel = buildRolesListPanel();
	  roleListPanel.setStyleName("borderPane"); //$NON-NLS-1$
	  
	  DockPanel roleDetailsDockPanel = buildRoleDetailsPanel();
	  roleDetailsDockPanel.setStyleName("borderPane"); //$NON-NLS-1$
    add(roleListPanel, DockPanel.WEST);
    add(roleDetailsDockPanel, DockPanel.CENTER);
    
    setSpacing(10);
    
    setCellWidth(roleListPanel, "30%"); //$NON-NLS-1$
    setCellWidth(roleDetailsDockPanel, "70%"); //$NON-NLS-1$
    setCellHeight(roleListPanel, "100%"); //$NON-NLS-1$
    setCellHeight(roleDetailsDockPanel, "100%"); //$NON-NLS-1$
    roleListPanel.setWidth("100%"); //$NON-NLS-1$
    roleListPanel.setHeight("100%"); //$NON-NLS-1$
    roleDetailsDockPanel.setWidth("100%"); //$NON-NLS-1$
    roleDetailsDockPanel.setHeight("100%"); //$NON-NLS-1$
    
    roleDetailsPanel.setEnabled(false);
    updateRoleBtn.setEnabled(false);
    
    newRoleDialogBox.addPopupListener(this);
    userAssignmentsDialog.addPopupListener(this);
    
    roleDetailsPanel.getRoleNameTextBox().setEnabled(false);
    
    confirmDeleteRolesDialog.setText(Messages.getString("deleteRoles")); //$NON-NLS-1$
    confirmDeleteRolesDialog.setMessage(Messages.getString("confirmRoleDeletionMsg")); //$NON-NLS-1$
    confirmDeleteRolesDialog.setOnOkHandler( new ICallback() {
      public void onHandle(Object o) {
        confirmDeleteRolesDialog.hide();
        deleteSelectedRoles();
        assignedUserSelectionChanged();
      }
    });
    
    confirmRemoveRoleAssignmentDialog.setText(Messages.getString("unassignUsers")); //$NON-NLS-1$
    confirmRemoveRoleAssignmentDialog.setMessage(Messages.getString("confirmUnassignUsersMsg")); //$NON-NLS-1$
    confirmRemoveRoleAssignmentDialog.setOnOkHandler( new ICallback() {
      public void onHandle(Object o) {
        confirmRemoveRoleAssignmentDialog.hide();
        unassignSelectedUsers();
        assignedUserSelectionChanged();
      }
    });
 	}

	public DockPanel buildRoleDetailsPanel() {
	  
    DockPanel assignedRolesPanel = buildAssignedUsersPanel();
    
	  DockPanel dockPanel = new DockPanel();
	  dockPanel.add(new Label(Messages.getString("userDetails")), DockPanel.NORTH); //$NON-NLS-1$
	  dockPanel.add(roleDetailsPanel, DockPanel.NORTH);
    dockPanel.add(updateRoleBtn, DockPanel.NORTH);
    
    SimplePanel spacerPanel = new SimplePanel();
    spacerPanel.add(new Label(" ")); //$NON-NLS-1$
    dockPanel.add(spacerPanel, DockPanel.NORTH);
    dockPanel.setCellHeight(spacerPanel, "10px"); //$NON-NLS-1$
    
	  dockPanel.add(assignedRolesPanel, DockPanel.CENTER);
	  
	  dockPanel.setCellHorizontalAlignment(updateRoleBtn, HasHorizontalAlignment.ALIGN_RIGHT);
    
	  dockPanel.setCellWidth(roleDetailsPanel, "100%"); //$NON-NLS-1$
	  dockPanel.setCellHeight(assignedRolesPanel, "100%"); //$NON-NLS-1$
	  dockPanel.setCellWidth(assignedRolesPanel, "100%"); //$NON-NLS-1$
	  
	  roleDetailsPanel.setWidth("100%"); //$NON-NLS-1$
    assignedRolesPanel.setWidth("100%"); //$NON-NLS-1$
    assignedRolesPanel.setHeight("100%"); //$NON-NLS-1$
	  
    updateRoleBtn.addClickListener(this);
	  return dockPanel;
	}
	
	public DockPanel buildRolesListPanel() {
	  DockPanel headerDockPanel = new DockPanel();
    headerDockPanel.add(deleteRoleBtn, DockPanel.EAST);
    VerticalPanel spacer = new VerticalPanel();
    spacer.setWidth("2"); //$NON-NLS-1$
    headerDockPanel.add(spacer, DockPanel.EAST);
	  headerDockPanel.add(addRoleBtn, DockPanel.EAST);
    Label label = new Label(Messages.getString("roles")); //$NON-NLS-1$
	  headerDockPanel.add(label, DockPanel.WEST);
	  headerDockPanel.setCellWidth(label, "100%"); //$NON-NLS-1$
    DockPanel roleListPanel = new DockPanel();
    roleListPanel.add(headerDockPanel, DockPanel.NORTH);
    roleListPanel.add(rolesList, DockPanel.CENTER);
    roleListPanel.add(filterTextBox, DockPanel.SOUTH  );
    roleListPanel.add(new Label(Messages.getString("filter")), DockPanel.SOUTH ); //$NON-NLS-1$

    roleListPanel.setCellHeight(rolesList, "100%"); //$NON-NLS-1$
    roleListPanel.setCellWidth(rolesList, "100%"); //$NON-NLS-1$
    roleListPanel.setHeight("100%"); //$NON-NLS-1$
    roleListPanel.setWidth("100%"); //$NON-NLS-1$
    rolesList.setHeight("100%"); //$NON-NLS-1$
    rolesList.setWidth("100%"); //$NON-NLS-1$
    filterTextBox.setWidth( "100%" ); //$NON-NLS-1$
    deleteRoleBtn.setEnabled(false);
    
    filterTextBox.addKeyboardListener( this );
    rolesList.addChangeListener(this);
    addRoleBtn.addClickListener(this);
    deleteRoleBtn.addClickListener(this);
    return roleListPanel;
	}
	
	public DockPanel buildAssignedUsersPanel() {
    DockPanel headerDockPanel = new DockPanel();
    headerDockPanel.add(deleteRoleAssignmentBtn, DockPanel.EAST);
    VerticalPanel spacer = new VerticalPanel();
    spacer.setWidth("2"); //$NON-NLS-1$
    headerDockPanel.add(spacer, DockPanel.EAST);
    headerDockPanel.add(addRoleAssignmentBtn, DockPanel.EAST);
    Label label = new Label(Messages.getString("assignedUsers")); //$NON-NLS-1$
    headerDockPanel.add(label, DockPanel.WEST);
    headerDockPanel.setCellWidth(label, "100%"); //$NON-NLS-1$
    
    DockPanel assignedUsersPanel = new DockPanel();
    assignedUsersPanel.add(headerDockPanel, DockPanel.NORTH);
    assignedUsersPanel.add(assignedUsersList, DockPanel.CENTER);
    assignedUsersPanel.setCellHeight(assignedUsersList, "100%"); //$NON-NLS-1$
    assignedUsersPanel.setCellWidth(assignedUsersList, "100%"); //$NON-NLS-1$
    assignedUsersList.setHeight("100%"); //$NON-NLS-1$
    assignedUsersList.setWidth("100%"); //$NON-NLS-1$
    
    assignedUsersList.addChangeListener(this);
    deleteRoleAssignmentBtn.addClickListener(this);
    addRoleAssignmentBtn.addClickListener(this);
    return assignedUsersPanel;
	}
	
	
	public void onClick(Widget sender) {
	  if (sender == updateRoleBtn) {
	    updateRoleDetails(sender);
	  } else if (sender == deleteRoleBtn) {
      if (rolesList.getSelectedObjects().size() &gt; 0) {
        confirmDeleteRolesDialog.center();
      }
	  } else if (sender == addRoleBtn) {
	    addNewRole();
	  } else if (sender == deleteRoleAssignmentBtn) {
      if (assignedUsersList.getSelectedObjects().size() &gt; 0) {
        confirmRemoveRoleAssignmentDialog.center();
      }
    } else if (sender == addRoleAssignmentBtn) {
      List&lt;ProxyPentahoRole&gt; selectedRoles = rolesList.getSelectedObjects();
      if (selectedRoles.size() == 1) {
        modifyUserAssignments(selectedRoles.get(0));
      }
    }
	}

  private void modifyUserAssignments(ProxyPentahoRole role) {
    userAssignmentsDialog.setRole(role);
    userAssignmentsDialog.center();
  }

	private void addNewRole() {
	  newRoleDialogBox.setUser(null);
    newRoleDialogBox.center();
   }
	
	@SuppressWarnings("unchecked")
	private void deleteSelectedRoles() {
	  final List&lt;ProxyPentahoRole&gt; selectedRoles = rolesList.getSelectedObjects();
	  if (selectedRoles.size() &gt; 0) {
	    AsyncCallback callback = new AsyncCallback() {
	      public void onSuccess(Object result) {
	        rolesList.removeObjects(selectedRoles);
	        roleSelectionChanged();
	      }

	      public void onFailure(Throwable caught) {
	        errorDialog.setText(ExceptionParser.getErrorHeader(caught.getMessage()));
	        errorMsgHtml.setHTML(ExceptionParser.getErrorMessage(caught.getMessage(), Messages.getString("errorDeletingRoles")));           //$NON-NLS-1$
	        errorDialog.center();
	      }
	    };
	    UserAndRoleMgmtService.instance().deleteRoles(selectedRoles.toArray(new ProxyPentahoRole[0]), callback);
	  }
	}
	
	private void unassignSelectedUsers() {
    List&lt;ProxyPentahoRole&gt; selectedRoles = rolesList.getSelectedObjects();
    if (selectedRoles.size() == 1) {
      ArrayList&lt;ProxyPentahoUser&gt; assignedUsers = new ArrayList&lt;ProxyPentahoUser&gt;();
      assignedUsers.addAll(Arrays.asList(UserAndRoleMgmtService.instance().getUsers(selectedRoles.get(0))));
      final List&lt;ProxyPentahoUser&gt; usersToUnassign = assignedUsersList.getSelectedObjects();
      assignedUsers.removeAll(usersToUnassign);      
      
      AsyncCallback&lt;Object&gt; callback = new AsyncCallback&lt;Object&gt;() {
        public void onSuccess(Object result) {
          assignedUsersList.removeObjects(usersToUnassign);
        }

        public void onFailure(Throwable caught) {
          errorDialog.setText(ExceptionParser.getErrorHeader(caught.getMessage()));
          errorMsgHtml.setHTML(ExceptionParser.getErrorMessage(caught.getMessage(), Messages.getString("errorUnassigningSelectedUsersFromRole")));           //$NON-NLS-1$
          errorDialog.center();
        }
      };
      UserAndRoleMgmtService.instance().setUsers(selectedRoles.get(0), (ProxyPentahoUser[])assignedUsers.toArray(new ProxyPentahoUser[0]), callback);
    }
  }
  
  private void assignedUserSelectionChanged() {
    deleteRoleAssignmentBtn.setEnabled(assignedUsersList.getSelectedObjects().size() &gt; 0);
  }
  
	private void roleSelectionChanged() {
    List&lt;ProxyPentahoRole&gt; selectedRoles = rolesList.getSelectedObjects();
    if (selectedRoles.size() == 1) {
      roleDetailsPanel.setRole(selectedRoles.get(0));
      List&lt;ProxyPentahoUser&gt;userList = Arrays.asList(UserAndRoleMgmtService.instance().getUsers(selectedRoles.get(0)));
      assignedUsersList.setObjects(userList);
    } else {
      roleDetailsPanel.setRole(null);
      List&lt;ProxyPentahoUser&gt; emptyUserList = Collections.emptyList();
      assignedUsersList.setObjects(emptyUserList);
    }
    roleDetailsPanel.setEnabled(selectedRoles.size() == 1);
    updateRoleBtn.setEnabled(selectedRoles.size() == 1);
    deleteRoleBtn.setEnabled(selectedRoles.size() &gt; 0);
    addRoleAssignmentBtn.setEnabled(selectedRoles.size() == 1);
    
    roleDetailsPanel.getRoleNameTextBox().setEnabled(false);
    assignedUserSelectionChanged();
	}
	
	@SuppressWarnings("unchecked")
	private void updateRoleDetails(final Widget sender) {
    final ProxyPentahoRole role = roleDetailsPanel.getRole();
    AsyncCallback callback = new AsyncCallback() {
      public void onSuccess(Object result) {
        // Since roles are compared by name, removeObject() will remove the old role from the list
        // and addObject() will add the new role to the list.
        rolesList.removeObject(role);
        rolesList.addObject(role);
        rolesList.setSelectedObject(role);
        ((Button)sender).setEnabled( true );
      }

      public void onFailure(Throwable caught) {
        errorDialog.setText(ExceptionParser.getErrorHeader(caught.getMessage()));
        errorMsgHtml.setHTML(ExceptionParser.getErrorMessage(caught.getMessage(), Messages.getString("errorUpdatingRole")));           //$NON-NLS-1$
        errorDialog.center();
        ((Button)sender).setEnabled( true );
      }
    };
    ((Button)sender).setEnabled( false );
    UserAndRoleMgmtService.instance().updateRole(role, callback);
	}
	
	public void onChange(Widget sender) {
    if (sender == rolesList) {
      roleSelectionChanged();
    } else if (sender == assignedUsersList) {
      assignedUserSelectionChanged();
    }
	}
	
	public void refresh() {
	  List&lt;ProxyPentahoRole&gt; roleList = Arrays.asList(UserAndRoleMgmtService.instance().getRoles());
	  rolesList.setObjects(roleList);
	  roleSelectionChanged();
	}
	
  public void onPopupClosed(PopupPanel sender, boolean autoClosed) {
    if ((sender == newRoleDialogBox) &amp;&amp; newRoleDialogBox.isRoleCreated()) {
      ProxyPentahoRole newRole = newRoleDialogBox.getRole();
      IListBoxFilter filter = rolesList.getFilter();
      if ((filter != null) &amp;&amp; !filter.accepts(newRole)){
        filterTextBox.setText(""); //$NON-NLS-1$
        rolesList.setFilter(null);
      }
      rolesList.addObject(newRole);
      rolesList.setSelectedObject(newRole);
      roleSelectionChanged();
    } else if ((sender == userAssignmentsDialog) &amp;&amp; userAssignmentsDialog.getUserAssignmentsModified()) {
      List&lt;ProxyPentahoUser&gt;userList = Arrays.asList(UserAndRoleMgmtService.instance().getUsers(userAssignmentsDialog.getRole()));
      assignedUsersList.setObjects(userList);
      assignedUserSelectionChanged();
    }
  }
  
  public void onKeyDown(Widget sender, char keyCode, int modifiers) {
  }

  public void onKeyPress(Widget sender, char keyCode, int modifiers) {
  }

  public void onKeyUp(Widget sender, char keyCode, int modifiers) {
    if (filterTextBox == sender) {
      rolesList.setFilter(new RoleNameFilter(filterTextBox.getText()));
      roleSelectionChanged();
    }
  }
  
}</pre></body></html>