com.hp.alm.ali.idea.cfg.AliAbstractConfigurable.java Source code

Java tutorial

Introduction

Here is the source code for com.hp.alm.ali.idea.cfg.AliAbstractConfigurable.java

Source

/*
 * Copyright 2014 Hewlett-Packard Development Company, L.P
 *
 * 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://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License 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.hp.alm.ali.idea.cfg;

import com.hp.alm.ali.idea.rest.ServerType;
import com.hp.alm.ali.idea.ui.editor.field.HTMLAreaField;
import com.hp.alm.ali.idea.util.ApplicationUtil;
import com.intellij.ide.ui.search.SearchableOptionsRegistrar;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserFactory;
import com.intellij.openapi.options.SearchableConfigurable;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.IconLoader;
import com.intellij.openapi.vfs.VirtualFile;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextPane;
import javax.swing.SwingConstants;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.JTextComponent;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.InputStream;

public abstract class AliAbstractConfigurable implements SearchableConfigurable, DocumentListener {

    public static final String HP_ALM_INTEGRATION = "HP ALM Integration Configuration";

    protected ConfigurationField locationField;
    protected ConfigurationField domainField;
    protected ConfigurationField projectField;
    protected ConfigurationField usernameField;
    protected ConfigurationField passwdField;
    protected JCheckBox storePasswd;

    private JButton testButton = new JButton("Test", IconLoader.getIcon("/toolwindows/toolWindowRun.png"));
    private JLabel testLabel = new JLabel("");

    protected JPanel configurationPanel;

    public Runnable enableSearch(String option) {
        return null;
    }

    public void disposeUIResources() {
    }

    public abstract String getDisplayName();

    public Icon getIcon() {
        return null;
    }

    public String getHelpTopic() {
        return null;
    }

    protected abstract void loadConfiguration();

    protected abstract String getCaption();

    protected abstract ConfigurationField getLocationField();

    protected abstract ConfigurationField getUsernameField();

    protected abstract ConfigurationField getPasswordField();

    protected abstract ConfigurationField getDomainField();

    protected abstract ConfigurationField getProjectField();

    protected void addAdditionalSettings(JPanel panel, GridBagConstraints c) {
    }

    protected Component getSouthernComponent() {
        return null;
    }

    protected void onConfigurationPanelInitialized() {
    }

    public void insertUpdate(DocumentEvent documentEvent) {
        enableDisableTest();
    }

    public void removeUpdate(DocumentEvent documentEvent) {
        enableDisableTest();
    }

    public void changedUpdate(DocumentEvent documentEvent) {
        enableDisableTest();
    }

    public JComponent createComponent() {
        ensureConfiguration();
        return configurationPanel;
    }

    protected void ensureConfiguration() {
        if (configurationPanel == null) {
            loadConfiguration();
            initialize();
            onConfigurationPanelInitialized();
        }
    }

    public boolean isModified(String location, String domain, String project, String username, String password,
            boolean storePassword) {
        return !locationField.getText().equals(location) || !domainField.getText().equals(domain)
                || !projectField.getText().equals(project) || !usernameField.getText().equals(username)
                || !passwdField.getText().equals(password)
                || (storePasswd.isSelected() && storePasswd.isEnabled()) != storePassword;
    }

    protected void enableDisableTest() {
        testLabel.setText("");
        testButton.setEnabled(!domainField.getText().isEmpty() && !projectField.getText().isEmpty()
                && !locationField.getText().isEmpty() && !usernameField.getText().isEmpty());
        storePasswd.setEnabled(!passwdField.getValue().isEmpty());
    }

    private void setTestText(final String value) {
        ApplicationUtil.invokeLaterIfNeeded(new Runnable() {
            @Override
            public void run() {
                testLabel.setText(value);
            }
        });
    }

    private void initialize() {
        SearchableOptionsRegistrar.getInstance().addOption("integration", null, HP_ALM_INTEGRATION, getId(),
                getDisplayName());
        SearchableOptionsRegistrar.getInstance().addOption("alm", null, HP_ALM_INTEGRATION, getId(),
                getDisplayName());
        SearchableOptionsRegistrar.getInstance().addOption("qc", null, HP_ALM_INTEGRATION, getId(),
                getDisplayName());
        SearchableOptionsRegistrar.getInstance().addOption("QC", null, HP_ALM_INTEGRATION, getId(),
                getDisplayName());
        SearchableOptionsRegistrar.getInstance().addOption("agm", null, HP_ALM_INTEGRATION, getId(),
                getDisplayName());
        SearchableOptionsRegistrar.getInstance().addOption("agile", null, HP_ALM_INTEGRATION, getId(),
                getDisplayName());
        SearchableOptionsRegistrar.getInstance().addOption("manager", null, HP_ALM_INTEGRATION, getId(),
                getDisplayName());

        JPanel content = new JPanel(new BorderLayout());
        JLabel label = new JLabel(IconLoader.getIcon("/ali_icon_64x64.png"));
        label.setVerticalAlignment(SwingConstants.TOP);

        JPanel jPanel = new JPanel(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.anchor = GridBagConstraints.NORTHWEST;
        c.insets = new Insets(3, 3, 3, 3);
        c.fill = GridBagConstraints.BOTH;
        c.gridx = 0;
        c.gridy = 0;
        c.gridheight = 6;
        jPanel.add(label, c);
        c.gridheight = 1;
        c.gridx++;
        c.gridwidth = 3;
        jPanel.add(new JLabel(getCaption()), c);
        c.gridwidth = 1;
        c.gridy++;
        jPanel.add(new JLabel("Location:"), c);
        SearchableOptionsRegistrar.getInstance().addOption("location", null, "Location:", getId(),
                getDisplayName());
        c.gridx++;
        locationField = getLocationField();
        jPanel.add((JTextComponent) locationField, c);
        locationField.getDocument().addDocumentListener(this);
        c.gridx = 2;
        c.gridy++;
        c.gridwidth = 2;
        JLabel exLabel = new JLabel("E.g. http://mycompany.com:8080/qcbin");
        exLabel.setFont(exLabel.getFont().deriveFont(Font.ITALIC, exLabel.getFont().getSize() - 2));
        jPanel.add(exLabel, c);
        c.gridwidth = 1;
        c.gridx = 1;
        c.gridy++;
        jPanel.add(new JLabel("Username:"), c);
        SearchableOptionsRegistrar.getInstance().addOption("username", null, "Username:", getId(),
                getDisplayName());
        c.gridx++;
        usernameField = getUsernameField();
        jPanel.add((JTextComponent) usernameField, c);
        usernameField.getDocument().addDocumentListener(this);
        c.gridx = 1;
        c.gridy++;
        jPanel.add(new JLabel("Password:"), c);
        SearchableOptionsRegistrar.getInstance().addOption("password", null, "Password:", getId(),
                getDisplayName());
        c.gridx++;
        passwdField = getPasswordField();
        jPanel.add((JTextComponent) passwdField, c);
        passwdField.getDocument().addDocumentListener(this);
        c.gridx = 1;
        c.gridy++;
        jPanel.add(new JLabel("Domain:"), c);
        SearchableOptionsRegistrar.getInstance().addOption("domain", null, "Domain:", getId(), getDisplayName());
        c.gridx++;
        domainField = getDomainField();
        jPanel.add((JTextComponent) domainField, c);
        domainField.getDocument().addDocumentListener(this);
        c.gridx = 1;
        c.gridy++;
        jPanel.add(new JLabel("Project:"), c);
        SearchableOptionsRegistrar.getInstance().addOption("project", null, "Project:", getId(), getDisplayName());
        c.gridx++;
        projectField = getProjectField();
        jPanel.add((JTextComponent) projectField, c);
        projectField.getDocument().addDocumentListener(this);
        c.gridx = 1;
        c.gridy++;
        c.gridwidth = 2;
        storePasswd = new JCheckBox("Remember password");
        jPanel.add(storePasswd, c);
        c.gridx = 1;
        c.gridy++;
        c.gridwidth = 1;
        testButton.setDisabledIcon(IconLoader.getIcon("/process/disabledRun.png"));
        testButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent actionEvent) {
                ProgressManager.getInstance().run(new Task.Modal(null, "Checking connection", false) {
                    public void run(ProgressIndicator indicator) {
                        try {
                            indicator.setIndeterminate(true);
                            ServerType type = AliConfigurable.getServerType(locationField.getText().trim(),
                                    domainField.getText().trim(), projectField.getText().trim(),
                                    usernameField.getText().trim(), passwdField.getText());
                            switch (type) {
                            case ALM11:
                            case ALI:
                            case ALI2:
                            case ALM11_5:
                            case ALI11_5:
                            case ALM12:
                            case ALI12:
                            case AGM:
                                setTestText("Connection successful (" + type.toString() + ")");
                                break;
                            }
                        } catch (Exception e) {
                            setTestText(e.getMessage());
                        }
                    }
                });
            }
        });
        jPanel.add(testButton, c);
        c.gridx++;
        c.gridwidth = 2;
        jPanel.add(testLabel, c);

        c.gridx = 0;
        c.gridy++;
        c.gridwidth = 1;
        jPanel.add(new JLabel(IconLoader.getIcon("/horizon.png")), c);

        JTextPane desc = HTMLAreaField.createTextPane(
                "<html>When connecting to HP Agile Manager you can either fill in the above form<br>"
                        + "manually or upload the tenant descriptor to auto-configure the values.<br>"
                        + "You can obtain the tenant descriptor from the ALI Summary tab in the<br>"
                        + "HP Agile Manager configuration</html>");
        desc.setOpaque(false);
        c.gridwidth = 3;
        c.gridx++;
        jPanel.add(desc, c);

        c.gridy++;
        c.fill = GridBagConstraints.NONE;
        final JButton browse = new JButton("Browse");
        browse.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                FileChooserDescriptor desc = new FileChooserDescriptor(true, false, false, false, false, false);
                final VirtualFile[] file = FileChooserFactory.getInstance().createFileChooser(desc, null, browse)
                        .choose((VirtualFile) null, null);
                if (file.length == 0) {
                    return;
                }

                try {
                    SAXBuilder builder = new SAXBuilder();
                    InputStream fis = file[0].getInputStream();
                    Document document = builder.build(fis);
                    Element rootNode = document.getRootElement();
                    locationField.setValue(rootNode.getChild("location").getText());
                    domainField.setValue(rootNode.getChild("domain").getText());
                    projectField.setValue(rootNode.getChild("project").getText());
                    fis.close();
                } catch (Exception ex) {
                    Messages.showErrorDialog("Tenant descriptor is not valid.", "Error");
                }
            }
        });
        jPanel.add(browse, c);

        addAdditionalSettings(jPanel, c);

        c.gridwidth = 1;
        c.gridx = 3;
        c.gridy++;
        c.weightx = 1.0;
        c.weighty = 1.0;
        jPanel.add(new JPanel(), c);

        content.add(jPanel, BorderLayout.CENTER);
        Component southern = getSouthernComponent();
        if (southern != null) {
            content.add(southern, BorderLayout.SOUTH);
        }

        configurationPanel = content;
    }
}