be.ac.ua.comp.scarletnebula.gui.windows.ServerPropertiesWindow.java Source code

Java tutorial

Introduction

Here is the source code for be.ac.ua.comp.scarletnebula.gui.windows.ServerPropertiesWindow.java

Source

/*
 * Copyright (C) 2011  Ives van der Flaas
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package be.ac.ua.comp.scarletnebula.gui.windows;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dasein.cloud.compute.Platform;

import be.ac.ua.comp.scarletnebula.core.Server;
import be.ac.ua.comp.scarletnebula.gui.ButtonFactory;
import be.ac.ua.comp.scarletnebula.gui.ChangeableLabel;
import be.ac.ua.comp.scarletnebula.gui.CopyableLabel;
import be.ac.ua.comp.scarletnebula.gui.LabelEditSwitcherPanel;
import be.ac.ua.comp.scarletnebula.gui.inputverifiers.ServernameInputVerifier;
import be.ac.ua.comp.scarletnebula.misc.Executable;
import be.ac.ua.comp.scarletnebula.misc.Utils;

import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;

public class ServerPropertiesWindow extends JDialog {

    private static final long serialVersionUID = 1L;

    private static Log log = LogFactory.getLog(ServerPropertiesWindow.class);

    private final JPanel overviewTab = new JPanel();

    private final JLabel statusLabel = new JLabel();
    private final JLabel dnsLabel = new CopyableLabel();
    private final JLabel ipLabel = new CopyableLabel();
    private final JLabel cloudLabel = new JLabel();
    private final JLabel unfriendlyNameLabel = new JLabel();
    private final JLabel sizeLabel = new JLabel();
    private final JLabel imageLabel = new JLabel();
    private final JLabel architectureLabel = new JLabel();
    private final JLabel platformLabel = new JLabel();

    private ChangeableLabel sshLabel;

    public ServerPropertiesWindow(final GUI gui, final Collection<Server> selectedServers) {
        super(gui, true);

        setLayout(new BorderLayout());
        setSize(550, 400);

        if (selectedServers.size() > 1) {
            setTitle("Server Properties - Scarlet Nebula");
        } else {
            setTitle(selectedServers.iterator().next().getFriendlyName() + " Properties - Scarlet Nebula");
        }

        createOverviewPanel(selectedServers);
        add(overviewTab, BorderLayout.CENTER);

        add(getBottomPanel(), BorderLayout.SOUTH);

        updateOverviewTab(selectedServers);
        setLocationRelativeTo(gui);
        setLocationByPlatform(true);
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        setVisible(true);
    }

    private JPanel getBottomPanel() {
        final JPanel bottomPanel = new JPanel();
        final JButton okButton = ButtonFactory.createOkButton();
        okButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(final ActionEvent e) {
                ServerPropertiesWindow.this.dispose();
            }
        });

        getRootPane().setDefaultButton(okButton);

        bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.LINE_AXIS));
        bottomPanel.add(Box.createHorizontalGlue());
        bottomPanel.add(okButton);
        bottomPanel.setBorder(BorderFactory.createEmptyBorder(0, 20, 20, 20));
        return bottomPanel;
    }

    private void createOverviewPanel(final Collection<Server> servers) {
        overviewTab.setLayout(new BorderLayout());

        final FormLayout layout = new FormLayout("right:max(40dlu;p), 4dlu, min(50dlu;p):grow, 7dlu, "
                + "right:max(40dlu;p), 4dlu, min(50dlu;p):grow", "");
        // add rows dynamically
        final DefaultFormBuilder builder = new DefaultFormBuilder(layout);
        builder.setDefaultDialogBorder();
        builder.appendSeparator("General Information");

        Component servernameComponent = null;
        Component servertagComponent = null;
        Component sshLoginMethodComponent = null;
        Component providerComponent = null;
        Component vncComponent = null;
        Component statisticsCommandComponent = null;

        if (servers.size() == 1) {
            final Server server = servers.iterator().next();

            servernameComponent = getSingleServerServerNameComponent(server);
            servertagComponent = getSingleServerTagComponent(server);
            sshLoginMethodComponent = getSingleServerSshLoginMethodComponent(server);
            providerComponent = getSingleProviderComponent(server);
            vncComponent = getSingleVNCComponent(server);
            statisticsCommandComponent = getSingleStatisticsCommandComponent(server);
        } else {
            servernameComponent = getMultipleServerServerNameComponent(servers);
            servertagComponent = getMultipleServerTagComponent(servers);
            sshLoginMethodComponent = new JLabel("...");
            providerComponent = getMultipleServersProviderComponent(servers);
            vncComponent = new JLabel("...");
            statisticsCommandComponent = new JLabel("...");
        }

        builder.append("Name", servernameComponent);
        builder.append("Tags", servertagComponent);
        builder.nextLine();

        builder.append("SSH Login", sshLoginMethodComponent);
        builder.append("Statistics Command", statisticsCommandComponent);
        builder.nextLine();

        builder.append("Provider", providerComponent);
        builder.append("VNC Password", vncComponent);
        builder.nextLine();

        builder.append("Architecture", architectureLabel);
        builder.append("Platform", platformLabel);
        builder.nextLine();

        builder.append("DNS Address", dnsLabel);
        builder.append("IP Address", ipLabel);
        builder.nextLine();

        builder.append("Status", statusLabel);
        builder.nextLine();

        builder.appendSeparator("Cloud Specific Information");
        builder.append("Name", unfriendlyNameLabel);
        builder.append("Size", sizeLabel);
        builder.nextLine();

        builder.append("Image", imageLabel);
        builder.nextLine();

        final JScrollPane bodyScrollPane = new JScrollPane(builder.getPanel());
        bodyScrollPane.setBorder(null);
        overviewTab.add(bodyScrollPane);
    }

    private String getStatisticsCommandRep(final Server server) {
        String returnValue;

        final String statisticsCommand = server.getStatisticsCommand();
        if (statisticsCommand.isEmpty()) {
            returnValue = "(None)";
        } else {
            if (statisticsCommand.equals(server.getCloud().getDefaultStatisticsCommand())) {
                returnValue = "(Default)";
            } else {
                returnValue = "(Custom)";
            }
        }
        return returnValue;
    }

    private Component getSingleStatisticsCommandComponent(final Server server) {
        return new ChangeableLabel(getStatisticsCommandRep(server), new Executable<JLabel>() {
            @Override
            public void run(final JLabel text) {
                new EditStatisticsCommandWindow(ServerPropertiesWindow.this, server);

                text.setText(getStatisticsCommandRep(server));
            }
        });
    }

    private String getVNCRep(final Server server) {
        if (!server.getVNCPassword().isEmpty()) {
            return server.getVNCPassword();
        } else {
            return "(Not set)";
        }
    }

    private Component getSingleVNCComponent(final Server server) {
        return new ChangeableLabel(getVNCRep(server), new Executable<JLabel>() {
            @Override
            public void run(final JLabel text) {
                final String result = JOptionPane.showInputDialog(ServerPropertiesWindow.this,
                        "Enter the password you'd like to use to establish VNC connections to this server.",
                        server.getVNCPassword());

                if (result != null && !result.isEmpty()) {
                    server.setVNCPassword(result);
                    server.store();
                    text.setText(result);
                }
            }
        });
    }

    private Component getMultipleServerTagComponent(final Collection<Server> servers) {
        final ArrayList<String> tags = new ArrayList<String>();

        for (final Server server : servers) {
            for (final String tag : server.getTags()) {
                if (!tags.contains(tag)) {
                    tags.add(tag);
                }
            }
        }
        return new JLabel(Utils.implode(tags, ", "));
    }

    private Component getMultipleServersProviderComponent(final Collection<Server> servers) {
        final List<String> names = new ArrayList<String>(servers.size());
        for (final Server server : servers) {
            final String provname = server.getCloud().getName();
            if (!names.contains(provname)) {
                names.add(provname);
            }
        }
        return new JLabel(Utils.implode(names, ", "));
    }

    private Component getSingleProviderComponent(final Server server) {
        return new ChangeableLabel(server.getCloud().getName(), new Executable<JLabel>() {
            @Override
            public void run(final JLabel text) {
                new ProviderPropertiesWindow(ServerPropertiesWindow.this, server.getCloud());
            }
        });
    }

    private Component getSingleServerSshLoginMethodComponent(final Server server) {
        sshLabel = new ChangeableLabel(getTextRepresentationOfSshSituation(server), new Executable<JLabel>() {
            @Override
            public void run(final JLabel text) {
                final ChangeServerSshLoginMethodWindow window = new ChangeServerSshLoginMethodWindow(
                        ServerPropertiesWindow.this, server);
                window.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(final ActionEvent e) {
                        text.setText(getTextRepresentationOfSshSituation(server));
                    }

                });
                window.setVisible(true);
            }
        });
        sshLabel.setBorder(null);
        return sshLabel;
    }

    private String getTextRepresentationOfSshSituation(final Server server) {
        String rv = "";

        if (server.usesSshPassword()) {
            rv = "Username & Password";
        } else {
            rv = "Keypair: " + server.getKeypair();
        }
        return rv;
    }

    private Component getSingleServerTagComponent(final Server server) {
        final ChangeableLabel tagLabel = new ChangeableLabel(
                Utils.implode(new ArrayList<String>(server.getTags()), ", "), new Executable<JLabel>() {
                    @Override
                    public void run(final JLabel label) {
                        final TaggingWindow win = new TaggingWindow(ServerPropertiesWindow.this, server.getTags());
                        win.addWindowClosedListener(new TaggingWindow.WindowClosedListener() {
                            @Override
                            public void windowClosed(final Collection<String> newTags) {
                                label.setText(Utils.implode(new ArrayList<String>(newTags), ", "));
                                server.setTags(newTags);
                                server.store();
                            }
                        });
                        win.setVisible(true);
                    }
                });
        return tagLabel;
    }

    private Component getMultipleServerServerNameComponent(final Collection<Server> servers) {
        Component servernameComponent;
        final List<String> names = new ArrayList<String>(servers.size());
        for (final Server server : servers) {
            names.add(server.getFriendlyName());
        }
        servernameComponent = new JLabel(Utils.implode(names, ", "));
        return servernameComponent;
    }

    private Component getSingleServerServerNameComponent(final Server server) {
        final JTextField servernameTextField = new JTextField();
        servernameTextField.setInputVerifier(new ServernameInputVerifier(servernameTextField, server));
        final LabelEditSwitcherPanel servername = new LabelEditSwitcherPanel(server.getFriendlyName(),
                servernameTextField);
        servername.addContentChangedListener(new LabelEditSwitcherPanel.ContentChangedListener() {
            @Override
            public void changed(final String newContents) {
                server.setFriendlyName(newContents);
                server.store();
            }
        });
        return servername;
    }

    private void updateOverviewTab(final Collection<Server> selectedServers) {
        if (selectedServers.size() == 0) {
            log.info("No selected servers. Not filling overview tab.");
            statusLabel.setText("");
            dnsLabel.setText("");
            ipLabel.setText("");
            cloudLabel.setText("");
            sizeLabel.setText("");
            unfriendlyNameLabel.setText("");
            imageLabel.setText("");
            return;
        }

        // Until multiple selected servers are supported, pick the last server
        Server selectedServer = null;

        for (final Server s : selectedServers) {
            selectedServer = s;
        }

        statusLabel.setText(selectedServer.getStatus().toString());
        dnsLabel.setText(selectedServer.getPublicDnsAddress());

        String ipString = "";

        for (final String ip : selectedServer.getPublicIpAddresses()) {
            ipString += ip + "\n";
        }

        ipLabel.setText(ipString);
        cloudLabel.setText(selectedServer.getCloud().getName());
        sizeLabel.setText(selectedServer.getSize());
        unfriendlyNameLabel.setText(selectedServer.getUnfriendlyName());
        imageLabel.setText(selectedServer.getImage());
        architectureLabel.setText(selectedServer.getArchitecture().toString());
        if (selectedServer.getPlatform() != Platform.UNKNOWN) {
            platformLabel.setText(selectedServer.getPlatform().toString());
        }

    }

}