/*
* 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 Pentaho Corporation. All rights reserved.
*
* Created Mar 25, 2008
* @author Michael D'Amour
*/
package org.pentaho.mantle.client.solutionbrowser.fileproperties;
import java.util.ArrayList;
import org.pentaho.gwt.widgets.client.buttons.RoundedButton;
import org.pentaho.gwt.widgets.client.dialogs.IDialogCallback;
import org.pentaho.gwt.widgets.client.dialogs.MessageDialogBox;
import org.pentaho.mantle.client.messages.Messages;
import org.pentaho.mantle.client.objects.RolePermission;
import org.pentaho.mantle.client.objects.SolutionFileInfo;
import org.pentaho.mantle.client.objects.UserPermission;
import org.pentaho.mantle.client.service.MantleServiceCache;
import org.pentaho.mantle.client.solutionbrowser.filelist.FileItem;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.Widget;
public class PermissionsPanel extends FlexTable implements IFileModifier {
public static final int PERM_ALL = -1;
public static final int PERM_NOTHING = 0;
public static final int PERM_EXECUTE = 0x01;
public static final int PERM_SUBSCRIBE = 0x02;
public static final int PERM_CREATE = 0x04;
public static final int PERM_UPDATE = 0x08;
public static final int PERM_DELETE = 0x10;
public static final int PERM_UPDATE_PERMS = 0x20;
private boolean dirty = false;
ArrayList<String> existingUsersAndRoles = new ArrayList<String>();
FileItem fileItem;
SolutionFileInfo fileInfo;
ListBox usersAndRolesList = new ListBox(false);
Label permissionsLabel = new Label(Messages.getString("permissionsColon")); //$NON-NLS-1$
FlexTable permissionsTable = new FlexTable();
RoundedButton removeButton = new RoundedButton(Messages.getString("remove")); //$NON-NLS-1$
RoundedButton addButton = new RoundedButton(Messages.getString("addPeriods")); //$NON-NLS-1$
public PermissionsPanel() {
usersAndRolesList.getElement().setId("sharePanelUsersAndRolesList");
addButton.getElement().setId("sharePanelAddButton");
removeButton.getElement().setId("sharePanelRemoveButton");
removeButton.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
// find list to remove
if (usersAndRolesList.getItemCount() == 0) {
return;
}
dirty = true;
final String userOrRoleString = usersAndRolesList.getValue(usersAndRolesList.getSelectedIndex());
for (UserPermission userPermission : fileInfo.userPermissions) {
if (userOrRoleString.equals(userPermission.name)) {
existingUsersAndRoles.remove(userPermission.name);
fileInfo.userPermissions.remove(userPermission);
break;
}
}
for (RolePermission rolePermission : fileInfo.rolePermissions) {
if (userOrRoleString.equals(rolePermission.name)) {
existingUsersAndRoles.remove(rolePermission.name);
fileInfo.rolePermissions.remove(rolePermission);
break;
}
}
usersAndRolesList.removeItem(usersAndRolesList.getSelectedIndex());
}
});
addButton.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
dirty = true;
final SelectUserOrRoleDialog pickUserRoleDialog = new SelectUserOrRoleDialog(existingUsersAndRoles, new IUserRoleSelectedCallback() {
public void roleSelected(String role) {
fileInfo.rolePermissions.add(new RolePermission(role, PERM_NOTHING));
usersAndRolesList.addItem(role + Messages.getString("role", role), role); //$NON-NLS-1$
existingUsersAndRoles.add(role);
usersAndRolesList.setSelectedIndex(usersAndRolesList.getItemCount() - 1);
buildPermissionsTable();
}
public void userSelected(String user) {
fileInfo.userPermissions.add(new UserPermission(user, PERM_NOTHING));
usersAndRolesList.addItem(Messages.getString("user", user), user); //$NON-NLS-1$
existingUsersAndRoles.add(user);
usersAndRolesList.setSelectedIndex(usersAndRolesList.getItemCount() - 1);
buildPermissionsTable();
}
});
pickUserRoleDialog.center();
}
});
FlowPanel buttonPanel = new FlowPanel();
buttonPanel.add(addButton);
buttonPanel.add(removeButton);
usersAndRolesList.setVisibleItemCount(7);
usersAndRolesList.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
// update permissions list and permission label (put username in it)
// rebuild permissionsTable settings based on selected mask
buildPermissionsTable();
}
});
usersAndRolesList.setWidth("100%"); //$NON-NLS-1$
buttonPanel.setWidth("100%"); //$NON-NLS-1$
permissionsTable.setStyleName("permissionsTable"); //$NON-NLS-1$
permissionsTable.setWidth("100%"); //$NON-NLS-1$
permissionsTable.setHeight("100%"); //$NON-NLS-1$
int row = 0;
setWidget(row++, 0, new Label(Messages.getString("usersAndRoles"))); //$NON-NLS-1$
setWidget(row++, 0, usersAndRolesList);
setWidget(row++, 0, buttonPanel);
setWidget(row++, 0, permissionsLabel);
setWidget(row++, 0, permissionsTable);
setWidth("100%"); //$NON-NLS-1$
}
public void buildPermissionsTable() {
String userOrRoleString = ""; //$NON-NLS-1$
permissionsTable.clear();
if (usersAndRolesList.getItemCount() == 0) {
permissionsLabel.setText(Messages.getString("permissionsColon")); //$NON-NLS-1$
} else {
userOrRoleString = usersAndRolesList.getValue(usersAndRolesList.getSelectedIndex());
permissionsLabel.setText(Messages.getString("permissionsFor", userOrRoleString)); //$NON-NLS-1$
}
int mask = PERM_NOTHING;
for (UserPermission userPermission : fileInfo.userPermissions) {
if (userOrRoleString.equals(userPermission.name)) {
mask = userPermission.mask;
break;
}
}
for (RolePermission rolePermission : fileInfo.rolePermissions) {
if (userOrRoleString.equals(rolePermission.name)) {
mask = rolePermission.mask;
break;
}
}
// create checkboxes, with listeners who update the fileInfo lists
final CheckBox allPermissionCheckBox = new CheckBox(Messages.getString("allPermissions")); //$NON-NLS-1$
final CheckBox createPermissionCheckBox = new CheckBox(Messages.getString("create")); //$NON-NLS-1$
final CheckBox updatePermissionCheckBox = new CheckBox(Messages.getString("update")); //$NON-NLS-1$
final CheckBox executePermissionCheckBox = new CheckBox(Messages.getString("execute")); //$NON-NLS-1$
final CheckBox deletePermissionCheckBox = new CheckBox(Messages.getString("delete")); //$NON-NLS-1$
final CheckBox grantPermissionCheckBox = new CheckBox(Messages.getString("grantPermissions")); //$NON-NLS-1$
final CheckBox subscribePermissionCheckBox = new CheckBox(Messages.getString("schedule")); //$NON-NLS-1$
allPermissionCheckBox.getElement().setId("sharePermissionAll");
createPermissionCheckBox.getElement().setId("sharePermissionCreate");
updatePermissionCheckBox.getElement().setId("sharePermissionUpdate");
executePermissionCheckBox.getElement().setId("sharePermissionExecute");
deletePermissionCheckBox.getElement().setId("sharePermissionDelete");
grantPermissionCheckBox.getElement().setId("sharePermissionGrant");
subscribePermissionCheckBox.getElement().setId("sharePermissionSubscribe");
if ("".equals(userOrRoleString)) { //$NON-NLS-1$
allPermissionCheckBox.setEnabled(false);
createPermissionCheckBox.setEnabled(false);
updatePermissionCheckBox.setEnabled(false);
executePermissionCheckBox.setEnabled(false);
deletePermissionCheckBox.setEnabled(false);
grantPermissionCheckBox.setEnabled(false);
subscribePermissionCheckBox.setEnabled(false);
}
if ((mask & PERM_ALL) == PERM_ALL) {
allPermissionCheckBox.setChecked(true);
createPermissionCheckBox.setEnabled(false);
updatePermissionCheckBox.setEnabled(false);
executePermissionCheckBox.setEnabled(false);
deletePermissionCheckBox.setEnabled(false);
grantPermissionCheckBox.setEnabled(false);
subscribePermissionCheckBox.setEnabled(false);
}
createPermissionCheckBox.setChecked((mask & PERM_CREATE) == PERM_CREATE);
updatePermissionCheckBox.setChecked((mask & PERM_UPDATE) == PERM_UPDATE);
executePermissionCheckBox.setChecked((mask & PERM_EXECUTE) == PERM_EXECUTE);
deletePermissionCheckBox.setChecked((mask & PERM_DELETE) == PERM_DELETE);
grantPermissionCheckBox.setChecked((mask & PERM_UPDATE_PERMS) == PERM_UPDATE_PERMS);
subscribePermissionCheckBox.setChecked((mask & PERM_SUBSCRIBE) == PERM_SUBSCRIBE);
allPermissionCheckBox.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
updatePermissionMask(allPermissionCheckBox.isChecked(), PERM_ALL);
createPermissionCheckBox.setChecked(allPermissionCheckBox.isChecked());
updatePermissionCheckBox.setChecked(allPermissionCheckBox.isChecked());
executePermissionCheckBox.setChecked(allPermissionCheckBox.isChecked());
deletePermissionCheckBox.setChecked(allPermissionCheckBox.isChecked());
grantPermissionCheckBox.setChecked(allPermissionCheckBox.isChecked());
subscribePermissionCheckBox.setChecked(allPermissionCheckBox.isChecked());
createPermissionCheckBox.setEnabled(!allPermissionCheckBox.isChecked());
updatePermissionCheckBox.setEnabled(!allPermissionCheckBox.isChecked());
executePermissionCheckBox.setEnabled(!allPermissionCheckBox.isChecked());
deletePermissionCheckBox.setEnabled(!allPermissionCheckBox.isChecked());
grantPermissionCheckBox.setEnabled(!allPermissionCheckBox.isChecked());
subscribePermissionCheckBox.setEnabled(!allPermissionCheckBox.isChecked());
}
});
createPermissionCheckBox.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
updatePermissionMask(createPermissionCheckBox.isChecked(), PERM_CREATE);
}
});
updatePermissionCheckBox.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
updatePermissionMask(updatePermissionCheckBox.isChecked(), PERM_UPDATE);
}
});
executePermissionCheckBox.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
updatePermissionMask(executePermissionCheckBox.isChecked(), PERM_EXECUTE);
}
});
deletePermissionCheckBox.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
updatePermissionMask(deletePermissionCheckBox.isChecked(), PERM_DELETE);
}
});
grantPermissionCheckBox.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
updatePermissionMask(grantPermissionCheckBox.isChecked(), PERM_UPDATE_PERMS);
}
});
subscribePermissionCheckBox.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
updatePermissionMask(subscribePermissionCheckBox.isChecked(), PERM_SUBSCRIBE);
}
});
permissionsTable.setWidget(0, 0, allPermissionCheckBox);
permissionsTable.setWidget(1, 0, createPermissionCheckBox);
permissionsTable.setWidget(2, 0, updatePermissionCheckBox);
permissionsTable.setWidget(3, 0, executePermissionCheckBox);
permissionsTable.setWidget(4, 0, deletePermissionCheckBox);
permissionsTable.setWidget(5, 0, grantPermissionCheckBox);
permissionsTable.setWidget(6, 0, subscribePermissionCheckBox);
}
public void updatePermissionMask(boolean grant, int mask) {
if (usersAndRolesList.getSelectedIndex() >= 0) {
dirty = true;
final String userOrRoleString = usersAndRolesList.getValue(usersAndRolesList.getSelectedIndex());
for (UserPermission userPermission : fileInfo.userPermissions) {
if (userOrRoleString.equals(userPermission.name)) {
if (grant) {
userPermission.mask = userPermission.mask | mask;
} else {
userPermission.mask &= ~mask;
}
break;
}
}
for (RolePermission rolePermission : fileInfo.rolePermissions) {
if (userOrRoleString.equals(rolePermission.name)) {
if (grant) {
rolePermission.mask = rolePermission.mask | mask;
} else {
rolePermission.mask &= ~mask;
}
break;
}
}
}
}
public void apply(final IDialogCallback applyCallback) {
if (!dirty) {
// do nothing if we're not dirty (make sure to invoke callback)
applyCallback.okPressed();
return;
}
// send the fileInfo back to the server, we've updated it
AsyncCallback<Void> callback = new AsyncCallback<Void>() {
public void onFailure(Throwable caught) {
MessageDialogBox dialogBox = new MessageDialogBox(Messages.getString("error"), caught.toString(), false, false, true); //$NON-NLS-1$
dialogBox.center();
// invoke the next
applyCallback.okPressed();
}
public void onSuccess(Void nothing) {
// MessageDialogBox dialogBox = new MessageDialogBox("Info", "Permissions set.", false, null, false, true);
// dialogBox.center();
// invoke the next
dirty = false;
applyCallback.okPressed();
}
};
MantleServiceCache.getService().setSolutionFileInfo(fileInfo, callback);
}
public void init(FileItem fileItem, SolutionFileInfo fileInfo) {
this.fileItem = fileItem;
this.fileInfo = fileInfo;
usersAndRolesList.clear();
existingUsersAndRoles.clear();
for (UserPermission userPermission : fileInfo.userPermissions) {
usersAndRolesList.addItem(Messages.getString("user", userPermission.name), userPermission.name); //$NON-NLS-1$
existingUsersAndRoles.add(userPermission.name);
}
for (RolePermission rolePermission : fileInfo.rolePermissions) {
usersAndRolesList.addItem(Messages.getString("role", rolePermission.name), rolePermission.name); //$NON-NLS-1$
existingUsersAndRoles.add(rolePermission.name);
}
if (usersAndRolesList.getItemCount() > 0) {
usersAndRolesList.setSelectedIndex(0);
}
buildPermissionsTable();
}
}