/*
* Copyright 2013 Amazon Technologies, Inc.
*
* 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://aws.amazon.com/apache2.0
*
* This file 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.amazonaws.eclipse.identitymanagement.group;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.forms.widgets.FormToolkit;
import com.amazonaws.eclipse.core.AwsToolkitCore;
import com.amazonaws.eclipse.explorer.identitymanagement.AbstractGroupTable;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.model.DeleteGroupPolicyRequest;
import com.amazonaws.services.identitymanagement.model.DeleteGroupRequest;
import com.amazonaws.services.identitymanagement.model.GetGroupRequest;
import com.amazonaws.services.identitymanagement.model.Group;
import com.amazonaws.services.identitymanagement.model.ListGroupPoliciesRequest;
import com.amazonaws.services.identitymanagement.model.ListGroupPoliciesResult;
import com.amazonaws.services.identitymanagement.model.RemoveUserFromGroupRequest;
import com.amazonaws.services.identitymanagement.model.UpdateGroupRequest;
import com.amazonaws.services.identitymanagement.model.User;
public class GroupTable extends AbstractGroupTable {
private GroupSummary groupSummary;
private UsersInGroup usersInGroup;
private GroupPermissions groupPermissions;
private final String DELTE_GROUP_CONFIRMATION = "All users and permissions belonging to the selected groups will be removed from the group first. Do you want to continue?";
public GroupTable(AmazonIdentityManagement iam, Composite parent, FormToolkit toolkit) {
super(iam, parent, toolkit);
MenuManager menuManager = new MenuManager("#PopupMenu");
menuManager.setRemoveAllWhenShown(true);
menuManager.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
if (viewer.getTable().getSelectionCount() > 0) {
manager.add(new Action() {
@Override
public ImageDescriptor getImageDescriptor() {
return AwsToolkitCore.getDefault().getImageRegistry().getDescriptor(AwsToolkitCore.IMAGE_REMOVE);
}
@Override
public void run() {
boolean confirmation = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Delete Group", DELTE_GROUP_CONFIRMATION);
if (confirmation) {
groupSummary.setGroup(null);
usersInGroup.setGroup(null);
groupPermissions.setGroup(null);
deleteMultipleGroups(viewer.getTable().getSelectionIndices());
}
}
@Override
public String getText() {
if (viewer.getTable().getSelectionIndices().length > 1) {
return "Delete Groups";
}
return "Delete Group";
}
});
manager.add(new Action() {
@Override
public ImageDescriptor getImageDescriptor() {
return null;
}
@Override
public void run() {
EditGroupNameDialog editGroupNameDialog = new EditGroupNameDialog(contentProvider.getItemByIndex(viewer.getTable().getSelectionIndex()).getGroupName());
if (editGroupNameDialog.open() == 0) {
editGroupName(editGroupNameDialog.getOldGroupName(), editGroupNameDialog.getNewGroupName());
}
}
@Override
public String getText() {
return "Edit Group Name";
}
});
}
}
});
viewer.getTable().setMenu(menuManager.createContextMenu(viewer.getTable()));
viewer.getTable().addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
int index = viewer.getTable().getSelectionIndex();
if (index >= 0) {
Group group = contentProvider.getItemByIndex(index);
groupSummary.setGroup(group);
usersInGroup.setGroup(group);
groupPermissions.setGroup(group);
} else {
groupSummary.setGroup(null);
usersInGroup.setGroup(null);
groupPermissions.setGroup(null);
}
}
});
}
public void setGroupSummary(GroupSummary groupSummary) {
this.groupSummary = groupSummary;
}
public void setUsersInGroup(UsersInGroup usersInGroup) {
this.usersInGroup = usersInGroup;
}
public void setGroupPermissions(GroupPermissions groupPermissions) {
this.groupPermissions = groupPermissions;
}
private void deleteGroup(String groupName) {
ListGroupPoliciesResult listGroupPoliciesResult = iam.listGroupPolicies(new ListGroupPoliciesRequest().withGroupName(groupName));
for (String policyName : listGroupPoliciesResult.getPolicyNames()) {
iam.deleteGroupPolicy(new DeleteGroupPolicyRequest().withGroupName(groupName).withPolicyName(policyName));
}
List<User> usersInGroup = iam.getGroup(new GetGroupRequest().withGroupName(groupName)).getUsers();
for (User user : usersInGroup) {
iam.removeUserFromGroup(new RemoveUserFromGroupRequest().withGroupName(groupName).withUserName(user.getUserName()));
}
iam.deleteGroup(new DeleteGroupRequest().withGroupName(groupName));
}
private void editGroupName(final String oldGroupName, final String newGroupName) {
new Job("Edit group name") {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
iam.updateGroup(new UpdateGroupRequest().withGroupName(oldGroupName).withNewGroupName(newGroupName));
} catch (Exception e) {
return new Status(Status.ERROR, AwsToolkitCore.PLUGIN_ID, "Unable to edit the group name : " + e.getMessage(), e);
}
refresh();
return Status.OK_STATUS;
}
}.schedule();
}
private void deleteMultipleGroups(final int[] indices) {
new Job("Delete groups") {
@Override
protected IStatus run(IProgressMonitor monitor) {
for (int index : indices) {
String groupName = contentProvider.getItemByIndex(index).getGroupName();
try {
deleteGroup(groupName);
} catch (Exception e) {
return new Status(Status.ERROR, AwsToolkitCore.PLUGIN_ID, "Unable to delete groups: " + e.getMessage(), e);
}
}
refresh();
return Status.OK_STATUS;
}
}.schedule();
}
@Override
protected void listGroups() {
groups = iam.listGroups().getGroups();
}
@Override
public void refresh() {
new LoadGroupTableThread().start();
}
}