com.amazonaws.eclipse.ec2.ui.elasticip.ElasticIpComposite.java Source code

Java tutorial

Introduction

Here is the source code for com.amazonaws.eclipse.ec2.ui.elasticip.ElasticIpComposite.java

Source

/*
 * Copyright 2008-2011 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();
        }
    }

}