/* * Copyright 2008-2012 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.ec2.ui.securitygroups; import java.util.List; import org.eclipse.core.runtime.Status; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.statushandlers.StatusManager; import com.amazonaws.eclipse.core.AwsToolkitCore; import com.amazonaws.eclipse.ec2.Ec2Plugin; import com.amazonaws.eclipse.ec2.ui.SelectionTable; import com.amazonaws.services.ec2.AmazonEC2; import com.amazonaws.services.ec2.model.CreateSecurityGroupRequest; import com.amazonaws.services.ec2.model.DeleteSecurityGroupRequest; import com.amazonaws.services.ec2.model.SecurityGroup; /** * Selection table containing a list of security groups. */ public class SecurityGroupSelectionComposite extends SelectionTable { private Action createSecurityGroupAction; private Action deleteSecurityGroupAction; private Action refreshSecurityGroupsAction; private SecurityGroupTableProvider securityGroupTableProvider = new SecurityGroupTableProvider(); private PermissionsComposite permissionsComposite; /** * Creates a new security group selection table parented by the specified * composite. * * @param parent * The parent of this new selection table. */ public SecurityGroupSelectionComposite(Composite parent) { super(parent); viewer.setContentProvider(securityGroupTableProvider); viewer.setLabelProvider(securityGroupTableProvider); viewer.setComparator(new SecurityGroupComparator()); refreshSecurityGroups(); } /** * Sets the optional security group permissions selection table that can be * linked with this security group selection table. * * @param permissionsComposite * The security group permissions selection table that is linked * with this security group selection table. */ public void setPermissionsComposite(PermissionsComposite permissionsComposite) { this.permissionsComposite = permissionsComposite; } /** * Returns the currently selected security group. * * @return The currently selected security group. */ public SecurityGroup getSelectedSecurityGroup() { StructuredSelection selection = (StructuredSelection)viewer.getSelection(); return (SecurityGroup)selection.getFirstElement(); } /* * Action Accessors */ public Action getRefreshSecurityGroupsAction() { return refreshSecurityGroupsAction; } public Action getCreateSecurityGroupAction() { return createSecurityGroupAction; } public Action getDeleteSecurityGroupAction() { return deleteSecurityGroupAction; } /* * SelectionTable Interface */ /* (non-Javadoc) * @see com.amazonaws.eclipse.ec2.ui.SelectionTable#createColumns() */ @Override protected void createColumns() { newColumn("Name", 20); newColumn("Description", 80); } /* (non-Javadoc) * @see com.amazonaws.eclipse.ec2.ui.SelectionTable#fillContextMenu(org.eclipse.jface.action.IMenuManager) */ @Override protected void fillContextMenu(IMenuManager manager) { deleteSecurityGroupAction.setEnabled(getSelectedSecurityGroup() != null); manager.add(refreshSecurityGroupsAction); manager.add(new Separator()); manager.add(createSecurityGroupAction); manager.add(deleteSecurityGroupAction); } /* (non-Javadoc) * @see com.amazonaws.eclipse.ec2.ui.SelectionTable#makeActions() */ @Override protected void makeActions() { createSecurityGroupAction = new Action() { public void run() { final CreateSecurityGroupDialog dialog = new CreateSecurityGroupDialog(Display.getCurrent().getActiveShell()); if (dialog.open() != Dialog.OK) return; new CreateSecurityGroupThread(dialog.getSecurityGroupName(), dialog.getSecurityGroupDescription()).start(); } }; createSecurityGroupAction.setText("New Group..."); createSecurityGroupAction.setToolTipText("Create a new security group"); createSecurityGroupAction.setImageDescriptor(Ec2Plugin.getDefault().getImageRegistry().getDescriptor("add")); deleteSecurityGroupAction = new Action() { public void run() { new DeleteSecurityGroupThread(getSelectedSecurityGroup()).start(); } }; deleteSecurityGroupAction.setText("Delete Group"); deleteSecurityGroupAction.setToolTipText("Delete security group"); deleteSecurityGroupAction.setImageDescriptor(Ec2Plugin.getDefault().getImageRegistry().getDescriptor("remove")); refreshSecurityGroupsAction = new Action() { public void run() { refreshSecurityGroups(); } }; refreshSecurityGroupsAction.setText("Refresh"); refreshSecurityGroupsAction.setToolTipText("Refresh security groups"); refreshSecurityGroupsAction.setImageDescriptor(Ec2Plugin.getDefault().getImageRegistry().getDescriptor("refresh")); } /* * Private Interface */ private void refreshSecurityGroups() { new RefreshSecurityGroupsThread().start(); } private class SecurityGroupComparator extends ViewerComparator { /* (non-Javadoc) * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) */ @Override public int compare(Viewer viewer, Object e1, Object e2) { if (!(e1 instanceof SecurityGroup && e2 instanceof SecurityGroup)) { return 0; } SecurityGroup securityGroup1 = (SecurityGroup)e1; SecurityGroup securityGroup2 = (SecurityGroup)e2; return (securityGroup1.getGroupName().compareTo(securityGroup2.getGroupName())); } } /** * Sets the list of security groups to display in the security group table. * * @param securityGroups * The security groups to display. */ private void setInput(final List<SecurityGroup> securityGroups) { Display.getDefault().asyncExec(new Runnable() { public void run() { final SecurityGroup previouslySelectedGroup = getSelectedSecurityGroup(); viewer.setInput(securityGroups); if (previouslySelectedGroup != null) { for (int index = 0; index < viewer.getTree().getItemCount(); index++) { TreeItem treeItem = viewer.getTree().getItem(index); SecurityGroup groupDescription = (SecurityGroup)treeItem.getData(); if (groupDescription.getGroupName().equals(previouslySelectedGroup.getGroupName())) { viewer.getTree().select(treeItem); } } } viewer.getTree().getColumn(0).pack(); viewer.getTree().layout(); layout(); } }); } /* * Private Thread subclasses for making EC2 service calls */ /** * Thread for making an EC2 service call to create a new security group. */ private class CreateSecurityGroupThread extends Thread { /** The requested name of the group */ private final String name; /** The requested description of the group */ private final String description; /** * Creates a new thread ready to be started to create the specified * security group. * * @param name * The requested name for the new security group. * @param description * The requested description for the new security group. */ public CreateSecurityGroupThread(final String name, final String description) { this.name = name; this.description = description; } /* (non-Javadoc) * @see java.lang.Thread#run() */ @Override public void run() { try { AmazonEC2 ec2 = getAwsEc2Client(); CreateSecurityGroupRequest request = new CreateSecurityGroupRequest(); request.setGroupName(name); request.setDescription(description); ec2.createSecurityGroup(request); refreshSecurityGroups(); } catch (Exception e) { Status status = new Status(Status.ERROR, Ec2Plugin.PLUGIN_ID, "Unable to create security group: " + e.getMessage(), e); StatusManager.getManager().handle(status, StatusManager.SHOW | StatusManager.LOG); } } } /** * Thread for making an EC2 service call to delete a security group. */ private class DeleteSecurityGroupThread extends Thread { /** The security group to delete */ private final SecurityGroup securityGroup; /** * Creates a new thread ready to be started and delete the specified * security group. * * @param securityGroup * The security group to delete. */ public DeleteSecurityGroupThread(final SecurityGroup securityGroup) { this.securityGroup = securityGroup; } /* (non-Javadoc) * @see java.lang.Thread#run() */ @Override public void run() { try { AmazonEC2 ec2 = getAwsEc2Client(); DeleteSecurityGroupRequest request = new DeleteSecurityGroupRequest(); request.setGroupName(securityGroup.getGroupName()); ec2.deleteSecurityGroup(request); refreshSecurityGroups(); } catch (Exception e) { Status status = new Status(Status.ERROR, Ec2Plugin.PLUGIN_ID, "Unable to delete security group: " + e.getMessage(), e); StatusManager.getManager().handle(status, StatusManager.SHOW | StatusManager.LOG); } } } /** * Thread for making an EC2 serivce call to list all security groups. */ private class RefreshSecurityGroupsThread extends Thread { /* (non-Javadoc) * @see java.lang.Thread#run() */ @Override public void run() { try { if (selectionTableListener != null) selectionTableListener.loadingData(); AmazonEC2 ec2 = getAwsEc2Client(); final List<SecurityGroup> securityGroups = ec2.describeSecurityGroups().getSecurityGroups(); setInput(securityGroups); if (permissionsComposite != null) permissionsComposite.refreshPermissions(); } catch (Exception e) { // Only log an error if the account info is valid and we // actually expected this call to work if (AwsToolkitCore.getDefault().getAccountInfo().isValid()) { Status status = new Status(Status.ERROR, Ec2Plugin.PLUGIN_ID, "Unable to refresh security groups: " + e.getMessage(), e); StatusManager.getManager().handle(status, StatusManager.LOG); } } finally { if (selectionTableListener != null) selectionTableListener.finishedLoadingData(-1); } } } }