/* * 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.elasticip; 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.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.statushandlers.StatusManager; import com.amazonaws.eclipse.ec2.Ec2Plugin; import com.amazonaws.eclipse.ec2.ui.SelectionTable; import com.amazonaws.services.ec2.model.Address; import com.amazonaws.services.ec2.model.AllocateAddressRequest; import com.amazonaws.services.ec2.model.ReleaseAddressRequest; /** * Selection table for selecting an Elastic IP. */ public class ElasticIpComposite extends SelectionTable { private Action newAddressAction; private Action refreshAddressesAction; private Action releaseAddressAction; /** * Creates a new Elastic IP selection table parented by the specified * composite. * * @param parent * The UI parent of this new selection table. */ public ElasticIpComposite(Composite parent) { super(parent); viewer.setContentProvider(new ViewContentProvider()); viewer.setLabelProvider(new ViewLabelProvider()); refreshAddressList(); } /* (non-Javadoc) * @see com.amazonaws.eclipse.ec2.ui.SelectionTable#getSelection() */ @Override public Address getSelection() { StructuredSelection selection = (StructuredSelection)viewer.getSelection(); return (Address)selection.getFirstElement(); } /* (non-Javadoc) * @see com.amazonaws.eclipse.ec2.ui.SelectionTable#addSelectionListener(org.eclipse.swt.events.SelectionListener) */ @Override public void addSelectionListener(SelectionListener listener) { viewer.getTree().addSelectionListener(listener); } public Action getNewAddressAction() { return newAddressAction; } public Action getRefreshAddressesAction() { return refreshAddressesAction; } public Action getReleaseAddressAction() { return releaseAddressAction; } /* * SelectionTable Interface */ /* (non-Javadoc) * @see com.amazonaws.eclipse.ec2.ui.SelectionTable#fillContextMenu(org.eclipse.jface.action.IMenuManager) */ @Override protected void fillContextMenu(IMenuManager manager) { manager.add(refreshAddressesAction); manager.add(new Separator()); manager.add(newAddressAction); manager.add(releaseAddressAction); } /* (non-Javadoc) * @see com.amazonaws.eclipse.ec2.ui.SelectionTable#makeActions() */ @Override protected void makeActions() { newAddressAction = new Action() { public void run() { new RequestElasticIpThread().start(); } }; newAddressAction.setText("New Elastic IP"); newAddressAction.setToolTipText("Requests a new Elastic IP address"); newAddressAction.setImageDescriptor(Ec2Plugin.getDefault().getImageRegistry().getDescriptor("add")); refreshAddressesAction = new Action() { public void run() { refreshAddressList(); } }; refreshAddressesAction.setText("Refresh"); refreshAddressesAction.setToolTipText("Refresh the Elastic IP address list"); refreshAddressesAction.setImageDescriptor(Ec2Plugin.getDefault().getImageRegistry().getDescriptor("refresh")); releaseAddressAction = new Action() { public void run() { StructuredSelection selection = (StructuredSelection)viewer.getSelection(); Address addressInfo = (Address) selection.getFirstElement(); new ReleaseElasticIpThread(addressInfo).start(); } }; releaseAddressAction.setText("Release"); releaseAddressAction.setToolTipText("Release this Elastic IP"); releaseAddressAction.setImageDescriptor(Ec2Plugin.getDefault().getImageRegistry().getDescriptor("remove")); } /* (non-Javadoc) * @see com.amazonaws.eclipse.ec2.ui.SelectionTable#createColumns() */ @Override protected void createColumns() { newColumn("Elastic IP", 40); newColumn("Attached Instance", 60); } /* * Private Interface */ private void refreshAddressList() { new RefreshAddressListThread().start(); } /* * Content and Label Providers */ private class ViewContentProvider implements ITreeContentProvider { List<Address> addresses; /* (non-Javadoc) * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) */ @SuppressWarnings("unchecked") public void inputChanged(Viewer v, Object oldInput, Object newInput) { addresses = (List<Address>)newInput; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IContentProvider#dispose() */ public void dispose() { } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) */ public Object[] getElements(Object parent) { if (addresses == null) { return new Object[0]; } return addresses.toArray(); } public Object[] getChildren(Object parentElement) { return new Object[0]; } public Object getParent(Object element) { return null; } public boolean hasChildren(Object element) { return false; } } private class ViewLabelProvider extends LabelProvider implements ITableLabelProvider { /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int) */ public String getColumnText(Object obj, int index) { if (!Address.class.isInstance(obj)) { return "???"; } Address addressInfo = (Address)obj; switch(index) { case 0: return addressInfo.getPublicIp(); case 1: return addressInfo.getInstanceId(); } return getText(obj); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int) */ public Image getColumnImage(Object obj, int index) { return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object) */ public Image getImage(Object obj) { return PlatformUI.getWorkbench(). getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT); } } /* * Private Threads for making EC2 service calls */ /** * Thread for making an EC2 service call to list all Elastic IPs for the * current account. */ private class RefreshAddressListThread extends Thread { /* (non-Javadoc) * @see java.lang.Thread#run() */ @Override public void run() { try { final List<Address> addresses = getAwsEc2Client().describeAddresses().getAddresses(); Display.getDefault().asyncExec(new Runnable() { public void run() { viewer.setInput(addresses); packColumns(); } }); } catch (Exception e) { Status status = new Status(Status.ERROR, Ec2Plugin.PLUGIN_ID, "Unable to list Elastic IPs: " + e.getMessage(), e); StatusManager.getManager().handle(status, StatusManager.LOG); } } } /** * Thread for making an EC2 service call to release an Elastic IP. */ private class ReleaseElasticIpThread extends Thread { /** The Elastic IP to release */ private final Address addressInfo; /** * Creates a new thread ready to be started to release the specified * Elastic IP. * * @param addressInfo * The Elastic IP to release. */ public ReleaseElasticIpThread(final Address addressInfo) { this.addressInfo = addressInfo; } /* (non-Javadoc) * @see java.lang.Thread#run() */ @Override public void run() { try { ReleaseAddressRequest request = new ReleaseAddressRequest(); request.setPublicIp(addressInfo.getPublicIp()); getAwsEc2Client().releaseAddress(request); } catch (Exception e) { Status status = new Status(Status.ERROR, Ec2Plugin.PLUGIN_ID, "Unable to release Elastic IP: " + e.getMessage(), e); StatusManager.getManager().handle(status, StatusManager.SHOW | StatusManager.LOG); } refreshAddressList(); } } /** * Thread for making an EC2 service call to request a new Elastic IP. */ private class RequestElasticIpThread extends Thread { /* (non-Javadoc) * @see java.lang.Thread#run() */ @Override public void run() { try { getAwsEc2Client().allocateAddress(new AllocateAddressRequest()); } catch (Exception e) { Status status = new Status(Status.ERROR, Ec2Plugin.PLUGIN_ID, "Unable to create new Elastic IP: " + e.getMessage(), e); StatusManager.getManager().handle(status, StatusManager.SHOW | StatusManager.LOG); } refreshAddressList(); } } }