com.microsoft.intellij.ui.azureroles.CertificatesPanel.java Source code

Java tutorial

Introduction

Here is the source code for com.microsoft.intellij.ui.azureroles.CertificatesPanel.java

Source

/**
 * Copyright (c) Microsoft Corporation
 * <p/>
 * All rights reserved.
 * <p/>
 * MIT License
 * <p/>
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
 * documentation files (the "Software"), to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
 * to permit persons to whom the Software is furnished to do so, subject to the following conditions:
 * <p/>
 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of
 * the Software.
 * <p/>
 * THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
 * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
package com.microsoft.intellij.ui.azureroles;

import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.options.BaseConfigurable;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.SearchableConfigurable;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.ui.ValidationInfo;
import com.intellij.ui.AnActionButton;
import com.intellij.ui.AnActionButtonRunnable;
import com.intellij.ui.AnActionButtonUpdater;
import com.intellij.ui.ToolbarDecorator;
import com.intellij.ui.table.TableView;
import com.intellij.util.ui.ColumnInfo;
import com.intellij.util.ui.ListTableModel;
import com.interopbridges.tools.windowsazure.WindowsAzureCertificate;
import com.interopbridges.tools.windowsazure.WindowsAzureInvalidProjectOperationException;
import com.interopbridges.tools.windowsazure.WindowsAzureProjectManager;
import com.interopbridges.tools.windowsazure.WindowsAzureRole;
import com.microsoft.intellij.ui.AzureAbstractPanel;
import com.microsoft.intellij.util.PluginUtil;
import com.microsoftopentechnologies.azurecommons.util.WAEclipseHelperMethods;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import static com.microsoft.intellij.ui.messages.AzureBundle.message;

public class CertificatesPanel extends BaseConfigurable
        implements AzureAbstractPanel, SearchableConfigurable, Configurable.NoScroll {
    private JPanel contentPane;
    private JPanel tablePanel;
    private TableView<WindowsAzureCertificate> tblCertificates;

    private Module module;
    private WindowsAzureProjectManager waProjManager;
    private WindowsAzureRole waRole;
    private Map<String, WindowsAzureCertificate> mapCert;
    public String certSelected = "";

    public CertificatesPanel(Module module, WindowsAzureProjectManager waProjManager, WindowsAzureRole waRole) {
        this.module = module;
        this.waProjManager = waProjManager;
        this.waRole = waRole;
        init();
    }

    private void init() {
        try {
            mapCert = waRole.getCertificates();
            CertificatesTableModel myModel = new CertificatesTableModel(
                    new ArrayList<WindowsAzureCertificate>(mapCert.values()));
            tblCertificates.setModelAndUpdateColumns(myModel);
            tblCertificates.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        } catch (Exception e) {
            PluginUtil.displayErrorDialogAndLog(message("certErrTtl"), message("certErrMsg"), e);
        }
    }

    @NotNull
    @Override
    public String getId() {
        return getDisplayName();
    }

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

    @Override
    public JComponent getPanel() {
        return contentPane;
    }

    @Nls
    @Override
    public String getDisplayName() {
        return message("cmhLblCert");
    }

    @Override
    public boolean doOKAction() {
        try {
            apply();
            return true;
        } catch (ConfigurationException e) {
            PluginUtil.displayErrorDialogAndLog(e.getTitle(), e.getMessage(), e);
            return false;
        }
    }

    @Override
    public String getSelectedValue() {
        return certSelected;
    }

    @Override
    public ValidationInfo doValidate() {
        return null;
    }

    @Override
    public String getHelpTopic() {
        return "windows_azure_certificates_page";
    }

    @Nullable
    @Override
    public JComponent createComponent() {
        return contentPane;
    }

    @Override
    public void apply() throws ConfigurationException {
        try {
            waProjManager.save();
        } catch (WindowsAzureInvalidProjectOperationException e) {
            throw new ConfigurationException(message("adRolErrMsgBox1") + message("adRolErrMsgBox2"),
                    message("adRolErrTitle"));
        }
        setModified(false);
    }

    @Override
    public void reset() {
        setModified(false);
    }

    @Override
    public void disposeUIResources() {
    }

    private final ColumnInfo<WindowsAzureCertificate, String> NAME = new ColumnInfo<WindowsAzureCertificate, String>(
            message("evColName")) {
        public String valueOf(WindowsAzureCertificate object) {
            return object.getName();
        }

        @Override
        public void setValue(WindowsAzureCertificate cert, String modifiedVal) {
            try {
                String certName = modifiedVal.trim();
                if (certName.isEmpty()) {
                    PluginUtil.displayErrorDialog(message("certErrTtl"), message("certInvMsg"));
                } else {
                    if (WAEclipseHelperMethods.isAlphaNumericUnderscore(certName)) {
                        boolean isValidName = true;
                        for (Iterator<String> iterator = mapCert.keySet().iterator(); iterator.hasNext();) {
                            String key = iterator.next();
                            if (key.equalsIgnoreCase(certName)) {
                                isValidName = false;
                                break;
                            }
                        }
                        if (isValidName || certName.equalsIgnoreCase(cert.getName())) {
                            cert.setName(certName);
                        } else {
                            PluginUtil.displayErrorDialog(message("certErrTtl"), message("certAddErrMsg"));
                        }
                    } else {
                        PluginUtil.displayErrorDialog(message("certErrTtl"), message("certRegMsg"));
                    }
                }
            } catch (Exception e) {
                PluginUtil.displayErrorDialogAndLog(message("certErrTtl"), message("certErrMsg"), e);
            }
        }
    };

    private final ColumnInfo<WindowsAzureCertificate, String> THUMBPRINT = new ColumnInfo<WindowsAzureCertificate, String>(
            message("evColName")) {
        public String valueOf(WindowsAzureCertificate object) {
            return object.getFingerPrint();
        }

        @Override
        public void setValue(WindowsAzureCertificate cert, String modifiedVal) {
            try {
                String modifiedTxt = modifiedVal.trim();
                if (modifiedTxt.isEmpty()) {
                    PluginUtil.displayErrorDialog(message("certErrTtl"), message("certInvMsg"));
                } else {
                    boolean isValidName = true;
                    for (Iterator<Map.Entry<String, WindowsAzureCertificate>> iterator = mapCert.entrySet()
                            .iterator(); iterator.hasNext();) {
                        WindowsAzureCertificate certObj = iterator.next().getValue();
                        if (certObj.getFingerPrint().equalsIgnoreCase(modifiedTxt)) {
                            isValidName = false;
                            break;
                        }
                    }
                    if (isValidName || modifiedTxt.equalsIgnoreCase(cert.getFingerPrint())) {
                        cert.setFingerPrint(modifiedTxt.toUpperCase());
                    } else {
                        PluginUtil.displayErrorDialog(message("certErrTtl"), message("certAddErrMsg"));
                    }
                }
            } catch (Exception e) {
                PluginUtil.displayErrorDialogAndLog(message("certErrTtl"), message("certErrMsg"), e);
            }
        }
    };

    private void createUIComponents() {
        tblCertificates = new TableView<WindowsAzureCertificate>();
        tablePanel = ToolbarDecorator.createDecorator(tblCertificates, null)
                .setAddAction(new AnActionButtonRunnable() {
                    @Override
                    public void run(AnActionButton button) {
                        addCertificate();
                    }
                }).setEditAction(null).setRemoveAction(new AnActionButtonRunnable() {
                    @Override
                    public void run(AnActionButton button) {
                        removeCertificate();
                    }
                }).setEditActionUpdater(new AnActionButtonUpdater() {
                    @Override
                    public boolean isEnabled(AnActionEvent e) {
                        return tblCertificates.getSelectedObject() != null;
                    }
                }).setRemoveActionUpdater(new AnActionButtonUpdater() {
                    @Override
                    public boolean isEnabled(AnActionEvent e) {
                        return tblCertificates.getSelectedObject() != null;
                    }
                }).disableUpDownActions().createPanel();
        tablePanel.setPreferredSize(new Dimension(-1, 200));
    }

    private void addCertificate() {
        CertificateDialog dialog = new CertificateDialog(module, mapCert, waRole);
        dialog.show();
        if (dialog.isOK()) {
            setModified(true);
            String name = dialog.getNewlyAddedCert();
            tblCertificates.getListTableModel().addRow(mapCert.get(name));
            List<WindowsAzureCertificate> items = tblCertificates.getItems();
            for (int i = 0; i < items.size(); i++) {
                WindowsAzureCertificate cert = items.get(i);
                if (cert.getName().equalsIgnoreCase(name)) {
                    tblCertificates.addSelection(cert);
                    break;
                }
            }
            decideCurSelectedCert();
        }
    }

    private void removeCertificate() {
        try {
            WindowsAzureCertificate delCert = tblCertificates.getSelectedObject();
            if (delCert.isRemoteAccess() && delCert.isSSLCert()) {
                String temp = String.format("%s%s%s", message("sslTtl"), " and ", message("cmhLblRmtAces"));
                PluginUtil.displayErrorDialog(message("certRmTtl"),
                        String.format(message("certComMsg"), temp, temp));
            } else if (delCert.isRemoteAccess()) {
                PluginUtil.displayErrorDialog(message("certRmTtl"),
                        String.format(message("certComMsg"), message("cmhLblRmtAces"), message("cmhLblRmtAces")));
            } else if (delCert.isSSLCert()) {
                PluginUtil.displayErrorDialog(message("certRmTtl"),
                        String.format(message("certComMsg"), message("sslTtl"), message("sslTtl")));
            } else {
                int choice = Messages.showOkCancelDialog(String.format(message("certRmMsg"), delCert.getName()),
                        message("certRmTtl"), Messages.getQuestionIcon());
                if (choice == Messages.OK) {
                    delCert.delete();
                    certSelected = "";
                    setModified(true);
                    tblCertificates.getListTableModel().removeRow(tblCertificates.getSelectedRow());
                }
            }
        } catch (WindowsAzureInvalidProjectOperationException e) {
            PluginUtil.displayErrorDialogAndLog(message("certErrTtl"), message("certErrMsg"), e);
        }
    }

    private void decideCurSelectedCert() {
        if (tblCertificates.getSelectedObject() != null) {
            WindowsAzureCertificate cert = tblCertificates.getSelectedObject();
            certSelected = cert.getName();
        } else {
            certSelected = "";
        }
    }

    private class CertificatesTableModel extends ListTableModel<WindowsAzureCertificate> {
        private CertificatesTableModel(java.util.List<WindowsAzureCertificate> listCertificates) {
            super(new ColumnInfo[] { NAME, THUMBPRINT }, listCertificates, 0);
        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            boolean retVal = true;
            @SuppressWarnings("unchecked")
            WindowsAzureCertificate certificate = getRowValue(rowIndex);
            try {
                if (certificate.isRemoteAccess() || certificate.isSSLCert()) {
                    retVal = false;
                }
            } catch (WindowsAzureInvalidProjectOperationException e) {
                PluginUtil.displayErrorDialogAndLog(message("certErrTtl"), message("certErrMsg"), e);
            }
            return retVal;
        }
    }
}