org.fusesource.ide.fabric.actions.jclouds.CloudContainerDetailsForm.java Source code

Java tutorial

Introduction

Here is the source code for org.fusesource.ide.fabric.actions.jclouds.CloudContainerDetailsForm.java

Source

/*******************************************************************************
 * Copyright (c) 2010 JVM Monitor project. All rights reserved.
 * 
 * This code is distributed under the terms of the Eclipse Public License v1.0
 * which is available at http://www.eclipse.org/legal/epl-v10.html
 *******************************************************************************/
package org.fusesource.ide.fabric.actions.jclouds;

import java.util.List;

import org.eclipse.core.databinding.observable.ChangeEvent;
import org.eclipse.core.databinding.observable.IChangeListener;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Text;
import org.fusesource.fabric.api.CreateJCloudsContainerOptions;
import org.fusesource.fabric.api.JCloudsInstanceType;
import org.fusesource.fabric.api.Profile;
import org.fusesource.ide.commons.Viewers;
import org.fusesource.ide.commons.ui.ICanValidate;
import org.fusesource.ide.fabric.actions.CreateContainerFormSupport;
import org.fusesource.ide.fabric.actions.Messages;
import org.fusesource.ide.fabric.navigator.ContainerNode;
import org.fusesource.ide.fabric.navigator.Fabric;
import org.fusesource.ide.fabric.navigator.ProfileNode;
import org.fusesource.ide.fabric.navigator.VersionNode;
import org.jclouds.compute.domain.Image;
import org.fusesource.fabric.zookeeper.IZKClient;

/**
 * The form for creating agents via jclouds
 */
public class CloudContainerDetailsForm extends CreateContainerFormSupport {

    private static final String PROP_OS_VERSION = "osVersion";
    private static final String PROP_OS_FAMILY = "family";
    private static final String PROP_IMAGE = "image";
    private static final String PROP_HARDWARE = "hardware";
    private static final String PROP_LOCATION = "location";
    private static final String PROP_USER = "user";
    private static final String PROP_GROUP = "group";

    private final ContainerNode selectedAgent;
    private final ProfileNode selectedProfile;
    private final Fabric fabric;
    private CreateJCloudsContainerArgumentsBean args = new CreateJCloudsContainerArgumentsBean();
    private ComboViewer imageField;
    private ComboViewer hardwareField;
    private ComboViewer locationField;
    private ComboViewer osFamilyField;
    private ComboViewer osVersionField;
    private CloudDetails selectedCloud;
    private Text userField;
    private Text groupField;
    private CloudDetailsCachedData cloudCacheData = new CloudDetailsCachedData(null);
    private ImageViewerFilter imageFilter = new ImageViewerFilter(null);
    private boolean isAWSEC2;

    private class ImageViewerFilter extends ViewerFilter {

        private String selectedLocation;

        /**
         * 
         */
        public ImageViewerFilter(String filter) {
            this.selectedLocation = filter;
        }

        @Override
        public boolean select(Viewer viewer, Object parentElement, Object element) {
            if (selectedLocation == null || selectedLocation.trim().length() < 1) {
                return true;
            }
            return ((Image) element).getId().startsWith(selectedLocation);
        }
    };

    private ISelectionChangedListener selectionListener = new ISelectionChangedListener() {
        @Override
        public void selectionChanged(SelectionChangedEvent event) {
            validate();
        }
    };

    public CloudContainerDetailsForm(ICanValidate validator, VersionNode versionNode, ContainerNode selectedAgent,
            String defaultAgentName, ProfileNode selectedProfile) {
        super(validator, versionNode, defaultAgentName);
        this.selectedAgent = selectedAgent;
        this.selectedProfile = selectedProfile;
        this.fabric = (versionNode != null) ? versionNode.getFabric()
                : (selectedProfile != null) ? selectedProfile.getFabric()
                        : (selectedAgent != null) ? selectedAgent.getFabric() : null;
        if (fabric != null) {
            args.setUser(fabric.getUserName());
        } else {
            args.setUser("admin");
        }
        args.setGroup("fabric");
    }

    private void presetCloudDetails() {
        if (selectedCloud != null)
            args.setProperties(selectedCloud);
        args.setInstanceType(JCloudsInstanceType.Smallest);
    }

    @Override
    protected boolean isMandatory(Object bean, String propertyName) {
        if (propertyName.equals(PROP_IMAGE) || propertyName.equals(PROP_OS_FAMILY)
                || propertyName.equals(PROP_OS_VERSION)) {
            // we will handle those in the isValid method
            return false;
        }
        return true;
    }

    public CreateJCloudsContainerOptions getCreateCloudArguments() {
        CreateJCloudsContainerOptions answer = args.delegate();
        // lets pass in the ComputeService
        IZKClient zooKeeper = null;
        Fabric fab = getFabric();
        if (fab != null) {
            zooKeeper = fab.getZooKeeper();
        }
        answer.setComputeService(cloudCacheData.createComputeClient(zooKeeper));
        return answer;
    }

    @Override
    public void setFocus() {
        groupField.setFocus();
    }

    public CloudDetails getSelectedCloud() {
        return selectedCloud;
    }

    public void setSelectedCloud(CloudDetails selectedCloud) {
        if (cloudCacheData != null) {
            cloudCacheData.cancelLoadingJobs();
        }

        this.selectedCloud = selectedCloud;

        cloudCacheData = CloudDetailsCachedData.getInstance(selectedCloud);
        setCloudDataInputs();
        cloudCacheData.startLoadingDataJobs();
        presetCloudDetails();
        restoreAll();
    }

    protected void setInput(final ComboViewer viewer, final WritableList list) {
        list.addChangeListener(new IChangeListener() {

            @Override
            public void handleChange(ChangeEvent event) {
                //            System.out.println("Updating viewer " + viewer + " with list of " + list.size() + " of type: " + list.getElementType());
                restoreSettings(viewer);
                Viewers.refresh(viewer);
            }
        });
        viewer.setInput(list);
    }

    public WritableList getImageList() {
        return cloudCacheData.getImageList();
    }

    public List getOSFamilyList() {
        return cloudCacheData.getOsFamilyList();
    }

    public List getOSVersionList() {
        return cloudCacheData.getOsVersionList();
    }

    public WritableList getHardwareList() {
        return cloudCacheData.getHardwareList();
    }

    public WritableList getLocationList() {
        return cloudCacheData.getLocationList();
    }

    @Override
    protected void loadPreference() {
        if (selectedProfile != null) {
            Profile profile = selectedProfile.getProfile();
            if (profile != null) {
                setCheckedProfiles(profile);
            }
        }
        super.loadPreference();
    }

    @Override
    protected void createTextFields(Composite inner) {
        super.createTextFields(inner);

        groupField = createBeanPropertyTextField(inner, args, PROP_GROUP, Messages.jclouds_groupLabel,
                Messages.jclouds_groupTooltip);
        userField = createBeanPropertyTextField(inner, args, PROP_USER, Messages.jclouds_userLabel,
                Messages.jclouds_userTooltip);

        // TODO how to bind the ID value from the selection lists?
        locationField = createBeanPropertyCombo(inner, args, PROP_LOCATION, Messages.jclouds_locationIdLabel,
                Messages.jclouds_locationIdTooltip, getLocationList());
        locationField.addSelectionChangedListener(new ISelectionChangedListener() {

            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                if (!isAWSEC2)
                    return;
                imageField.setFilters(new ViewerFilter[0]);
                imageFilter = new ImageViewerFilter(locationField.getCombo().getText());
                imageField.setFilters(new ViewerFilter[] { imageFilter });
            }
        });
        hardwareField = createBeanPropertyCombo(inner, args, PROP_HARDWARE, Messages.jclouds_hardwareIdLabel,
                Messages.jclouds_hardwareIdTooltip, getHardwareList());

        // os fields
        osFamilyField = createBeanPropertyCombo(inner, args, PROP_OS_FAMILY, Messages.jclouds_osFamilyLabel,
                Messages.jclouds_osFamilyTooltip, getOSFamilyList());
        osFamilyField.addSelectionChangedListener(selectionListener);
        osVersionField = createBeanPropertyCombo(inner, args, PROP_OS_VERSION, Messages.jclouds_osVersionLabel,
                Messages.jclouds_osVersionTooltip, getOSVersionList());
        osVersionField.addSelectionChangedListener(selectionListener);

        imageField = createBeanPropertyCombo(inner, args, PROP_IMAGE, Messages.jclouds_imageIdLabel,
                Messages.jclouds_imageIdTooltip, getImageList());
        imageField.addSelectionChangedListener(selectionListener);

        Composite btn_bar = new Composite(inner, SWT.NULL);
        btn_bar.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false, 2, 1));
        btn_bar.setLayout(new FillLayout(SWT.HORIZONTAL));

        Button btn_Clear = new Button(btn_bar, SWT.PUSH);
        btn_Clear.setText(Messages.clearLabel);
        btn_Clear.setToolTipText(Messages.clearTooltip);
        btn_Clear.addSelectionListener(new SelectionListener() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                reset();
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent e) {
                widgetSelected(e);
            }
        });

        Button btn_Reset = new Button(btn_bar, SWT.PUSH);
        btn_Reset.setText(Messages.defaultsLabel);
        btn_Reset.setToolTipText(Messages.defaultsTooltip);
        btn_Reset.addSelectionListener(new SelectionListener() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                reset();
                restoreAll();
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent e) {
                widgetSelected(e);
            }
        });

        setCloudDataInputs();
    }

    protected void setCloudDataInputs() {
        setInput(imageField, getImageList());
        setInput(hardwareField, getHardwareList());
        setInput(locationField, getLocationList());
        osFamilyField.setInput(getOSFamilyList());
        osVersionField.setInput(getOSVersionList());
    }

    private void reset() {
        imageField.setSelection(null);
        hardwareField.setSelection(null);
        locationField.setSelection(null);
        osFamilyField.setSelection(null);
        osVersionField.setSelection(null);
        if (fabric != null) {
            args.setUser(fabric.getUserName());
        } else {
            args.setUser("admin");
        }
        groupField.setText("");
        userField.setText("");
    }

    private void restoreAll() {
        restoreSettings();
        restoreSettings(hardwareField);
        restoreSettings(locationField);
        restoreSettings(imageField);
    }

    protected ComboViewer createBeanPropertyCombo(Composite parent, Object bean, String propertyName,
            String labelText, String tooltip, List<?> input) {
        ComboViewer answer = createBeanPropertyCombo(parent, bean, propertyName, labelText, tooltip, SWT.READ_ONLY);
        answer.setInput(input);
        answer.setLabelProvider(JCloudsLabelProvider.getInstance());
        return answer;
    }

    @Override
    public void okPressed() {
    }

    /* (non-Javadoc)
     * @see org.fusesource.ide.fabric.actions.ProfileTreeSelectionFormSupport#isValid()
     */
    @Override
    public boolean isValid() {
        boolean valid = super.isValid();

        if (!valid)
            return valid;

        String imgTxt = imageField.getCombo().getText();
        String osFamTxt = osFamilyField.getCombo().getText();

        if (imgTxt.trim().length() > 0 || (osFamTxt.trim().length() > 0)) {
            // image or osFamily have to be selected
            return valid;
        } else {
            return false;
        }
    }

    /* (non-Javadoc)
     * @see org.fusesource.ide.fabric.actions.CreateContainerFormSupport#getFormHeader()
     */
    @Override
    protected String getFormHeader() {
        return Messages.createCloudContainerDetailsFormHeaderLabel;
    }

    /* (non-Javadoc)
     * @see org.fusesource.ide.fabric.actions.CreateContainerFormSupport#getSectionHeader()
     */
    @Override
    protected String getSectionHeader() {
        return Messages.createCloudContainerDetailsFormSectionHeaderLabel;
    }

    public void saveSettings() {
        if (!userField.isDisposed())
            cloudCacheData.getDetails().addSetting("user", userField.getText());
        if (!groupField.isDisposed())
            cloudCacheData.getDetails().addSetting("group", groupField.getText());
        if (!imageField.getCombo().isDisposed())
            cloudCacheData.getDetails().addSetting("image", imageField.getCombo().getText());
        if (!hardwareField.getCombo().isDisposed())
            cloudCacheData.getDetails().addSetting("hardware", hardwareField.getCombo().getText());
        if (!locationField.getCombo().isDisposed())
            cloudCacheData.getDetails().addSetting("location", locationField.getCombo().getText());
        if (!osFamilyField.getCombo().isDisposed())
            cloudCacheData.getDetails().addSetting("osfamily", osFamilyField.getCombo().getText());
        if (!osVersionField.getCombo().isDisposed())
            cloudCacheData.getDetails().addSetting("osversion", osVersionField.getCombo().getText());
        cloudCacheData.getDetails().flush();
    }

    public void restoreSettings(final ComboViewer viewer) {
        if (cloudCacheData == null || cloudCacheData.getDetails() == null)
            return;
        Display.getDefault().asyncExec(new Runnable() {
            @Override
            public void run() {
                if (viewer.getCombo().isDisposed())
                    return;
                if (viewer.equals(hardwareField)) {
                    preSelectItem(hardwareField,
                            cloudCacheData.getDetails().getSetting("hardware", hardwareField.getCombo().getText()));
                } else if (viewer.equals(locationField)) {
                    preSelectItem(locationField,
                            cloudCacheData.getDetails().getSetting("location", locationField.getCombo().getText()));
                } else if (viewer.equals(hardwareField)) {
                    preSelectItem(imageField,
                            cloudCacheData.getDetails().getSetting("image", imageField.getCombo().getText()));
                }
                // revalidate
                validate();
            }
        });
    }

    public void restoreSettings() {
        if (cloudCacheData.getDetails() == null)
            return;

        // check if we work with Amazon EC2 provider...if not we disable the image filtering by location
        this.isAWSEC2 = cloudCacheData.getDetails().getProviderId().equals("aws-ec2");

        Display.getDefault().asyncExec(new Runnable() {
            /* (non-Javadoc)
             * @see java.lang.Runnable#run()
             */
            @Override
            public void run() {
                if (!userField.isDisposed())
                    userField.setText(cloudCacheData.getDetails().getSetting("user", userField.getText()));
                if (!groupField.isDisposed())
                    groupField.setText(cloudCacheData.getDetails().getSetting("group", groupField.getText()));
                if (!osFamilyField.getCombo().isDisposed())
                    preSelectItem(osFamilyField,
                            cloudCacheData.getDetails().getSetting("osfamily", osFamilyField.getCombo().getText()));
                if (!osVersionField.getCombo().isDisposed())
                    preSelectItem(osVersionField, cloudCacheData.getDetails().getSetting("osversion",
                            osVersionField.getCombo().getText()));
            }
        });
    }

    private void preSelectItem(ComboViewer viewer, String itemToSelect) {
        for (Object o : (List) viewer.getInput()) {
            String oName = JCloudsLabelProvider.getInstance().getText(o);
            if (oName.equals(itemToSelect)) {
                viewer.setSelection(new StructuredSelection(o), true);
            }
        }
    }
}